Frage an file, c, fread – Bewegt Fread den Dateizeiger?

15

Einfache Frage,

Wenn ich fread benutze:

fread(ArrayA, sizeof(Reg), sizeBlock, fp);

Mein Dateizeiger,fp ist vorgerückt?

Deine Antwort

4   die antwort
2

fp wird um die Gesamtzahl der gelesenen Bytes vorgerückt.
In deinem Fall die FunktionStirnrunzeln liestsizeBlock Objekte, jedessizeof(Reg) Bytes lang, aus dem Stream, auf den von verwiesen wirdfpund lagern sie an dem vonArrayA.

29

das Aufrufen von fread verschiebt in der Tat den Dateizeiger. Der Dateizeiger wird um die Anzahl der tatsächlich gelesenen Bytes vorgerückt. Bei einem Fehler in fread ist die Dateiposition nach dem Aufrufen von fread nicht angegeben.

23

Antworten: Ja, die Position des Dateizeigers wird nach dem Lesevorgang automatisch aktualisiert, so dass nacheinanderfread() Funktionen lesen aufeinanderfolgende Dateisätze.

Klärung: fread() ist eine blockorientierte Funktion. Der Standardprototyp ist:

size_t fread(void *ptr,
             size_t size,
             size_t limit,
             FILE *stream);

Die Funktion liest aus dem Stream, auf den von verwiesen wirdstream und platziert die gelesenen Bytes in dem Array, auf das durch gezeigt wirdptr, Es wird nicht mehr gelesen, wenn eine der folgenden Bedingungen erfüllt ist:

Es hat gelesenlimit Elemente der Größesize, oderEs erreicht das Ende der Datei oderEin Lesefehler tritt auf.

fread() gibt Ihnen so viel Kontrolle wiefgetc(), und hat den Vorteil, dass in einer einzigen E / A-Operation mehr als ein Zeichen gelesen werden kann. In der Tat können Sie, sofern der Speicher dies zulässt, die gesamte Datei in ein Array einlesen und die gesamte Verarbeitung im Speicher durchführen. Dies hat erhebliche 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 Festplattendateien.

@ DavidHeffernan: siehe bitte die Bearbeitung ... Addicted
Nun, es würde nicht schaden, auch eine Erklärung dafür in Ihre Antwort aufzunehmen. David Heffernan
Ah, danke für die Antwort. Ich habe mich gefragt, was ich mit fseek tun müsste, um den Dateizeiger neu zu positionieren. Richard
Ich habe die Reihenfolge umgekehrt, um die hier in den Kommentaren ausgedrückten Gedanken wiederzugeben. Die Antwort war eigentlich der kleine Abschnitt "Bearbeiten" am Ende. Ich hoffe, dass diese Änderung das Leserlebnis bei der Suche nach einer Antwort verbessern wird. Dr Beco
0

Ja tut es. Es könnte mit überprüft werdenftell () Funktion, um die aktuelle Position anzuzeigen (tatsächlich die bisher gelesenen Bytes), schauen Sie es sich an:

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;
}

Verwandte Fragen