Frage

Ich habe eine Datei. Ich las die Größe der Datei. Dann habe ich Schleife liest zwei Bytes zu einer Zeit, bis ich zum Ende der Datei. Nach jedem Lesevorgang erhöhe ich die aktuelle Position von 2, jedoch die Position nicht erhöht wird erhalten, nachdem ich auf der Hälfte der Größe der Datei zu erhalten, wird der fread Betrieb 0 Byte gelesen werden.

Das Programm liest die Dateigröße. I führen fread (2 Bytes jedes Mal), bis die aktuelle Position auf die Größe der Datei gleich. Es liest 22915 byes für die Dateigröße Es erhöht Position 2 nach jeder Lese jedoch, wenn aktuelle Position 11459 wird die Hälfte der Größe der Datei ist es Null-Bytes so geht in eine Endlosschleife lesen.

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;
}
War es hilfreich?

Lösung

readCount = fread(&val, sizeof(val), 2, file);  

Diese Anweisung liest zwei Elemente von jeweils zwei Bytes. Und es gibt den Wert 2 , für die Anzahl der Artikel zu lesen. Die zweite und dritte Parameter miteinander multipliziert, um sagen fread, wie viele Bytes zu lesen.

Andere Tipps

fread kehrt die Anzahl der Elemente zu lesen, nicht Anzahl von Bytes.

(Übrigens, in Ihrem Code Sie versehentlich geben sie ein Element Zahl von 2, die einen Pufferüberlauf verursacht).

Sie sollten überprüfen fread Rückgabewert, so dass Sie werden nicht in Endlosschleifen im Fall von Fehlern führen.

Statt für die Dateigröße abzufragen, würde ich rufen Sie einfach fread (oder andere Eingabefunktionen) in einer Schleife bis zum Ende der Datei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top