Einfache Frage,Bewegt Fread den Dateizeiger?
Wenn ich fread verwenden:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
Meine Dateizeiger wird fp
bewegt voraus?
Einfache Frage,Bewegt Fread den Dateizeiger?
Wenn ich fread verwenden:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
Meine Dateizeiger wird fp
bewegt voraus?
Antwort: Ja, die Position des Dateizeigers wird automatisch nach dem Lesevorgang aktualisiert, so dass aufeinander folgende fread()
Funktionen aufeinanderfolgende Dateiaufzeichnungen lesen.
Erläuterung:fread()
ist eine blockorientierte Funktion. Der Standard-Prototyp ist:
size_t fread(void *ptr,
size_t size,
size_t limit,
FILE *stream);
Die Funktion liest aus dem Strom zu spitz durch stream
und legt das Bytes in das Array zu lesen von ptr
zeigte, wird es aufhören zu lesen, wenn eine der folgenden Bedingungen erfüllt ist:
limit
Elemente der Größe size
lesen oderfread()
gibt Ihnen so viel Kontrolle wie fgetc()
und hat den Vorteil, dass mehr als ein Zeichen in einer einzigen E/A-Operation zu lesen. In der Tat, wenn es der Arbeitsspeicher erlaubt, können Sie die gesamte Datei in ein Array lesen und all Ihre Verarbeitung im Speicher durchführen. Dies hat signifikante Leistungsvorteile.
fread()
wird oft verwendet, um Datensätze mit fester Länge direkt in Strukturen zu lesen, aber Sie können damit jede Datei lesen. Es ist meine persönliche Wahl zum Lesen der meisten Dateien.
Ja, das Aufrufen von fread verschiebt tatsächlich den Dateizeiger. Der Dateizeiger wird um die Anzahl der tatsächlich gelesenen Bytes erweitert. Im Falle eines Fehlers in fread ist die Dateiposition nach dem Aufrufen von fread nicht spezifiziert.
Ja, Die fp
wird um die Gesamtanzahl gelesener Bytes erweitert.
In Ihrem Fall die Funktion freadsizeBlock
Objekte liest, die jeweils sizeof(Reg)
Bytes lang, aus dem Strom zu fp
von darauf, sie an der Stelle gegeben durch ArrayA
speichern.
Ja, tut es. Es könnte durch die Verwendung ftell() Funktion, um zu zeigen aktuelle Position (in der Tat, Bytes gelesen bisher), werfen Sie einen Blick überprüft werden:
int main() {
typedef struct person {
char *nome; int age;
} person;
// write struct to file 2x or more...
FILE *file = fopen(filename, "rb");
person p;
size_t byteslength = sizeof(struct person);
printf("ftell: %ld\n", ftell(file));
fread(&p, byteslength, 1, file);
printf("name: %s | age: %d\n", p.nome, p.idade);
printf("ftell: %ld\n", ftell(file));
fread(&p, byteslength, 1, file);
printf("name: %s | age: %d\n", p.nome, p.idade);
//...
fclose(file);
return 0;
}
Ah, danke für die Antwort. Ich habe mich gefragt, was fseek verwenden müsste, um den Dateizeiger neu zu positionieren. – Richard
Diese Antwort adressiert nicht die Frage, die gefragt wurde, was einfach passiert mit dem Dateizeiger nach dem Aufruf fread –
nach meinem Verständnis fragte er nach Klarheit, warum es passiert ist ..... – Addicted