PDA

View Full Version : [C] Devo mettere un file in un buffer


misterx
07-06-2012, 15:12
char linea[256], buf=NULL;

while ( fgets(linea,sizeof(linea),fp) != NULL)
{

buf=(char *)realloc(NULL,strlen(buf)+strlen(linea)+1);
strcat(buf, linea);
buf[strlen(buf)]='\0';
}


non mi è chiaro dove stia l'errore concettuale

misterx
07-06-2012, 15:56
scusate ma ho risolto


grazie lo stesso

misterx
07-06-2012, 19:55
char *buf=NULL, stringa[256];
buf=(char *)malloc(sizeof(char *));

while ( fgets(stringa,sizeof(stringa),fp) != NULL)
{
buf=(char *)realloc(buf,strlen(buf)+strlen(stringa)+1);
strcat(buf, stringa);
}



ad ogni modo, pensavo che la linea in grassetto la si poteva omettere ed invece se manca viene generato un errore.

WarDuck
07-06-2012, 20:52
Non mi piace.

In pratica stai riallocando la memoria ad ogni lettura, che è una cosa che tipicamente non si fa.

In particolare leggi il file a blocchi di 256bytes alla volta, ed inizialmente non si sa perché allochi il buffer di sizeof(char*) ovvero 4 o 8 bytes a seconda che tu stia su una architettura a 32 o a 64 bit.

Inoltre stai facendo una copia del buffer, valuta se questo effettivamente ti serve oppure se puoi lavorare in "streaming" su quei 256 bytes (oppure leggi 4K alla volta).

misterx
08-06-2012, 05:51
in streaming non posso in quanto devo poi passare il buffer completo ad una funzione NON scritta da me la quale si aspetta tutto il file completo: mistero ma è così.

Avevo pensato anche ad un'altra soluzione:

- leggo tutto il file la prima volta e determino la sua dimensione
- con la malloc assegno la memoria a buf
- con la strcat riempio buf

karch_kiraly
08-06-2012, 06:01
Senza che lo leggi tutto:
1) apri il file in binary mode
2) fai le seguenti due istruzioni:
fseek(fp, 0L, SEEK_END);
sz = ftell(fp); // sz= dimensione del file, Max 2GB
3) Con un malloc allochi lo spazio necessario
4) leggi il file