Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++]Velocizzare funzione per la stampa a video del peso di un file in creazione..

    Salve a tutti. Grazie anche alle risposte ad un post precedente, sono riuscito nell'intento di stampare a video la percentuale della creazione di un file. Non è stato troppo difficile.
    Il problema è che all'ìinterno del ciclo for ci sono troppe istruzioni, e di conseguenza la creazione del file è notevolmente rallentata. Sapreste trovarmi qualche strataggemma per velocizzare l'esecuzione di questo codice?
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    void main()
    {
    srand ( (unsigned) time(NULL) );
    FILE * fp;
    fp = fopen ("C:\\unfilechenonesiste.txt", "w");
    int mega=1024*1024*5; //5 MB
    if (fp==NULL)
    cout<<"impossibile aprire il file\n";
    else
    {
    	for (int i=0;i<=mega;i++) 
    	{	
    		fprintf(fp, "%c", i); //scrittura del file
    		fseek(fp, 0, SEEK_END); //posizionamento alla fine del file
    		printf("%4.2f %%\r",(float(ftell(fp))*100)/mega); //ricerca della dimensione e stampa a video della percentuale
    	}
    }
    }
    Grazie in anticipo. Cordiali saluti. Ciaoo

  2. #2
    lo srand serviva nell'esempio quando riempivo il file con caratteri casuali. Ignoratelo pure...

  3. #3
    ma perchè a ogni ciclo calcoli la dimensione del file, basta farlo *una* volta.

    P.S.: correggi il sorgente perchè è pieno di errori.

  4. #4
    Il sorgente era corretto, è solo che prima di postarlo ho tolto qualche fronzolo, ma ne sono rimasti alcuni che generano errori.
    Il sorgente corretto è questo
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    void main()
    {
    FILE * fp;
    fp = fopen ("C:\\docume~1\\%username%\\unfilechenonesiste.txt", "w");
    int mega=1024*1024*5; //5 MB
    
    
    if (fp==NULL)
    cout<<"impossibile aprire il file\n";
    else
    {
    	for (int i=0;i<=mega;i++) 
    	{	
    		fprintf(fp, "%c", i); //scrittura del file
    		fseek(fp, 0, SEEK_END); //posizionamento alla fine del file
    		printf("%4.2f %%\r",(float(ftell(fp))*100)/mega); //ricerca della dimensione e stampa a video della percentuale
    	}
    }
    }
    calcolo il peso ogno volta perchè per aggiornare la percentuale da stampare a video, devo posizionarmi ogni volta alla fine (fseek), contare i byte (ftell) e stampare a video la percentuale. Dato che il file è in creazione, se usassi fseek all'infuori del ciclo si posizionerebbe in un punto che cossrisponde alla fine in quel momento, ma che pochi attimi dopo è già stato occupato dal contenuto. non so se mi sono spiegato. Comunque grazie per adesso.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La for puo' diventare tranquillamente

    codice:
    	for (int i=0;i<=mega;i++) 
    	{	
    		fprintf(fp, "%c", i); //scrittura del file
    		printf("%4.2f %%\r", (double)(i*100)/mega); 
    	}
    dato che scrivi un solo carattere alla volta ...

    E questo e' il motivo della "lentezza" ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Originariamente inviato da Sprunk
    Il sorgente era corretto, è solo che prima di postarlo ho tolto qualche fronzolo, ma ne sono rimasti alcuni che generano errori.
    Il sorgente corretto è questo
    codice:
    ...
    calcolo il peso ogno volta perchè per aggiornare la percentuale da stampare a video, devo posizionarmi ogni volta alla fine (fseek), contare i byte (ftell) e stampare a video la percentuale. Dato che il file è in creazione, se usassi fseek all'infuori del ciclo si posizionerebbe in un punto che cossrisponde alla fine in quel momento, ma che pochi attimi dopo è già stato occupato dal contenuto. non so se mi sono spiegato. Comunque grazie per adesso.
    no quello che volevo far notare sono gli errori tipo void main o iostream.h.
    Il sorgente corretto dovrebbe essere:
    codice:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
       FILE * fp = fopen ("C:\\docume~1\\%username%\\unfilechenonesiste.txt", "w");
       int mega=1024*1024*5; //5 MB
    
    
       if (fp == NULL)
       {
           
           cout << "impossibile aprire il file\n";
           
       }
       else
       {
    	for (int i=0; i<=mega; i++) 
    	{	
    		fprintf(fp, "%c", i); //scrittura del file
    		fseek(fp, 0, SEEK_END); //posizionamento alla fine del file
    		printf("%4.2f %%\r", (double)(i*100)/mega); //ricerca della dimensione e stampa a video della percentuale
    	}
       }
       
       return 0;
       
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.