PDA

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


Sprunk
19-04-2008, 00:41
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?


#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

Sprunk
19-04-2008, 00:42
lo srand serviva nell'esempio quando riempivo il file con caratteri casuali. Ignoratelo pure...

menphisx
19-04-2008, 03:37
ma perchè a ogni ciclo calcoli la dimensione del file, basta farlo *una* volta.

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

Sprunk
19-04-2008, 03:42
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


#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.

oregon
19-04-2008, 08:27
La for puo' diventare tranquillamente



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" ...

menphisx
19-04-2008, 18:20
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


...

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:


#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;

}


:ciauz:

Loading