2012-05-22 7 views

Antwort

18

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:

  • Es hat limit Elemente der Größe size lesen oder
  • Er erreicht das Ende der Datei oder
  • ein Lesefehler auftritt.

fread() 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.

+0

Ah, danke für die Antwort. Ich habe mich gefragt, was fseek verwenden müsste, um den Dateizeiger neu zu positionieren. – Richard

+12

Diese Antwort adressiert nicht die Frage, die gefragt wurde, was einfach passiert mit dem Dateizeiger nach dem Aufruf fread –

+0

nach meinem Verständnis fragte er nach Klarheit, warum es passiert ist ..... – Addicted

28

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.

2

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.

0

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