C-programmazione ftell fseek fread, leggere dimensioni di un file
Domanda
Ho un file. Ho letto la dimensione del file. Poi ho ciclo lettura di due byte alla volta fino a che non arrivare alla fine del file. Dopo ogni operazione di lettura I INCREMENT la posizione corrente 2, tuttavia la posizione non viene incrementato dopo arrivare a metà della dimensione del file, l'operazione fread leggerà 0 byte.
il programma legge la dimensione del file. Eseguo fread (2 byte ogni volta) finché la posizione corrente è uguale alla dimensione del file. Si legge 22915 bye per la dimensione del file Incrementa posizione mediante 2 dopo ogni lettura, tuttavia quando la posizione corrente arriva a 11459 che è metà della dimensione del file leggerà zero byte andando così in un ciclo infinito.
FILE *file;
char *file_name;
int readCount = 0;
int position = 0;
int fileSize;
unsigned short mem_accesses;
file_name = "sample.txt";
/** open the file */
file = fopen(file_name, "rb");
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
rewind(file);
while(position<fileSize){
mem_accesses = getNumberAccesses();
printf("position: %d filesize: %d\n",position, fileSize);
}
unsigned short getNumberAccesses(){
/** calculate number of accesses for process */
unsigned short val;
readCount = fread(&val, sizeof(val), 2, file);
position += readCount;
printf("read count: %d\n", readCount);
return val;
}
Soluzione
readCount = fread(&val, sizeof(val), 2, file);
Questa affermazione legge due articoli di due byte ciascuno. E restituisce il valore 2 , per il numero di elementi di lettura. Il secondo e il terzo parametro moltiplicati insieme raccontano fread
quanti byte da leggere.
Altri suggerimenti
fread restituisce il numero di elementi di lettura, non numero di byte.
(Per inciso, nel codice per errore si dà un conteggio elemento di 2, che causa un buffer overflow).
Si dovrebbe controllare il valore di ritorno di fread in modo da non incorrere in cicli infiniti nel caso di errori.
Invece di query per la dimensione del file, vorrei semplicemente chiamare fread (o altre funzioni di ingresso) in un ciclo fino alla fine del file.