PDA

Visualizza la versione completa : [C] Lettura da un file


skyboy85
01-12-2007, 11:10
salve a tutti,

sto scrivendo un programma dove ad un certo punto nasce la necessità di leggere l'intero contenuto di un file di testo e di copiarlo in una stringa.

Ho pensato a queste soluzioni:



int file;
char* buff;

file=open("/home/user/prova.txt",O_RDONLY );

while(read(file,buff,1)>0); // 1 byte perchè ho pensato di copiarne uno alla volta,ma nn so se è correto

oppure:



FILE* fd;
char* buff;

fd=fopen("/home/user/prova.txt","r" );

while(feof(fd)==0){
fgets(buff,1,fd);
}


sinceramente nn so se sono corrette... :dhò:
ah dimenticavo il file di testo contiene un'intera richiesta o risposta http

andbin
01-12-2007, 11:21
Originariamente inviato da skyboy85
sinceramente nn so se sono corrette... :dhò:Nessuna delle due è corretta, primo perché non hai allocato alcuna memoria per il buffer ... hai solo un puntatore peraltro non inizializzato, secondo perché la lettura di 1 byte è innanzitutto inefficiente ma sopratutto non andresti "avanti" nel buffer di memoria per come l'hai fatta. E con fgets non leggeresti nulla, ha bisogno di un buffer più ampio perché ci deve stare almeno il nullo finale ed eventualmente, se ci sta, il newline \n.

Poi la tua prima soluzione utilizza funzioni di I/O non standard che sono specifiche della piattaforma e quindi, se non per casi particolari, da evitare.

skyboy85
01-12-2007, 11:25
la prima soluzione l'ho scritta perchè il codice lo sto realizzando sotto Linux...

hai ragione mi sono dimenticato di allocare spazio...

per la seconda correzione nn ho ben capito,se puoi farmi un esempio è meglio...grazie :)

andbin
01-12-2007, 11:34
Originariamente inviato da skyboy85
per la seconda correzione nn ho ben capito,se puoi farmi un esempio è meglioNelle funzioni di lettura hai specificato 'buff'. Quindi scriveresti il byte letto sempre nella stessa locazione. Nella memoria non si "accodano" in automatico i byte letti! Semmai sei tu che devi farlo appositamente, spostando il puntamento nel buffer di memoria per far "depositare" i byte più avanti.

Comunque se vuoi leggere l'intero contenuto di un file hai sostanzialmente due soluzioni: o determini a priori la dimensione del file, quindi allochi un blocco di memoria di quella dimensione e leggi tutto quanto oppure allochi e in seguito ri-allochi il blocco di memoria man mano che leggi il file.

skyboy85
01-12-2007, 14:35
o determini a priori la dimensione del file, quindi allochi un blocco di memoria di quella dimensione e leggi tutto quanto

mi potresti dire come si fa a calcolare a prioiri la dimensione del file???

andbin
01-12-2007, 16:22
Originariamente inviato da skyboy85
mi potresti dire come si fa a calcolare a prioiri la dimensione del file??? Puoi fare un seek al fondo del file e leggere il file position (con le funzioni in stdio.h, si usa fseek/ftell).

skyboy85
02-12-2007, 16:57
mmmm..se nn ti dispiace potresti scrivermi un codice di esempio???
grazie mille :zizi:

andbin
02-12-2007, 17:34
Originariamente inviato da skyboy85
mmmm..se nn ti dispiace potresti scrivermi un codice di esempio???Per determinare la lunghezza del file con fseek/ftell? Sì è semplice, puoi usare una funzioncina come questa:


long get_file_size (FILE *stream)
{
long pos, size;

if ((pos = ftell (stream)) == -1)
return -1; /* errore */

if (fseek (stream, 0, SEEK_END) != 0)
return -1; /* errore */

if ((size = ftell (stream)) == -1)
return -1; /* errore */

if (fseek (stream, pos, SEEK_SET) != 0)
return -1; /* errore */

return size;
}

Loading