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;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top