fwrite und fread sind I/O-Funktionen, die in Einheiten von Datensätzen arbeiten. Die Funktionen fread und fwrite werden im Allgemeinen für die Ein- und Ausgabe von Binärdateien verwendet.

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Rückgabewert: die Anzahl der gelesenen oder geschriebenen Datensätze. Bei Erfolg entspricht die Anzahl der zurückgegebenen Datensätze nmemb. Bei einem Fehler oder beim Erreichen des Dateiendes ist die Anzahl der zurückgegebenen Datensätze kleiner als nmemb, und es kann auch 0 zurückgegeben werden.

fread und fwrite werden zum Lesen und Schreiben von Datensätzen verwendet. Ein Datensatz bezeichnet hier eine Bytefolge fester Länge, wie z. B. ein int, ein struct oder ein Array fester Länge. Der Parameter size gibt die Länge eines Datensatzes an, während nmemb angibt, wie viele Datensätze gelesen oder geschrieben werden sollen. Diese Datensätze werden zusammenhängend in dem von ptr angegebenen Speicherbereich gespeichert und belegen insgesamt size * nmemb Bytes. fread liest size * nmemb Bytes aus dem Dateistream und speichert sie in ptr, während fwrite die size * nmemb Bytes in ptr in den Dateistream schreibt.

nmemb ist die Anzahl der zum Lesen oder Schreiben angeforderten Datensätze. Die Anzahl der von fread und fwrite zurückgegebenen Datensätze kann kleiner sein als die Anzahl der durch nmemb angegebenen Datensätze. Wenn beispielsweise die aktuelle Lese-/Schreibposition nur eine Datensatzlänge vom Dateiende entfernt ist und beim Aufruf von fread nmemb als 2 angegeben wird, ist der Rückgabewert 1. Wenn die aktuelle Lese-/Schreibposition bereits am Dateiende liegt oder beim Lesen der Datei ein Fehler auftritt, gibt fread 0 zurück. Wenn beim Schreiben der Datei ein Fehler auftritt, ist der Rückgabewert von fwrite kleiner als der durch nmemb angegebene Wert. Das folgende Beispiel besteht aus zwei Programmen: Ein Programm speichert ein struct in eine Datei, und das andere Programm liest das struct aus der Datei.

#include <stdio.h>  
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);  
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);  

Referenzcode für fwrite und fread:

Code der Datei writerec.c

/* -------------------writerec.c--------------- */

#include <stdio.h>
#include <stdlib.h>

struct record {
    char name[10]; 
    int age;
};  

int main(void)
{  
    struct record array[2] = {{"Ken", 24}, {"Knuth", 28}}; 
    FILE *fp = fopen("d:/test.txt", "w");
    if (fp == NULL) {  
        perror("Open file recfile"); 
        exit(1);  
    }  
    fwrite(array, sizeof(struct record), 2, fp);
    fclose(fp);
    return 0;
}

Code der Datei readrec.c:

/* -------------------readrec.c----------------- */

#include <stdio.h>
#include <stdlib.h>

struct record {
    char name[10];
    int age;
};  

int main(void)  
{  
    struct record array[2]; 
    FILE *fp = fopen("d:/test.txt", "r"); 
    if (fp == NULL) {  
        perror("Open file recfile");
        exit(1);  
    }  
    fread(array, sizeof(struct record), 2, fp);  
    printf("Name1: %s\tAge1: %d\n", array[0].name, array[0].age);  
    printf("Name2: %s\tAge2: %d\n", array[1].name, array[1].age);  
    fclose(fp);  
    return 0;  
}
$ gcc writerec.c -o writerec
$ gcc readrec.c -o readrec

Es wurde festgestellt, dass die erzeugte Datei recfile nicht direkt geöffnet werden kann.

Grund:Wir behandeln einstruct record struct als einen Datensatz. Da das Struct Padding-Bytes enthält, belegt jeder Datensatz 16 Bytes, und das Schreiben von zwei Datensätzen in die Datei belegt insgesamt 32 Bytes. Die von diesem Programm erzeugte Datei recfile ist eine Binärdatei und keine Textdatei, da sie nicht nur Zeichendaten, sondern auch die Integerdaten 24 und 28 speichert (in der Ausgabe des od-Befehls oktal als 030 und 034 dargestellt).

Beachten Sie, dass Programme, die Structs direkt in Dateien lesen und schreiben, nicht portabel sind. Wenn Sie das Programm writebin.c auf einer Plattform kompilieren und ausführen, die erzeugte Datei recfile auf eine andere Plattform kopieren und das Programm readbin.c auf dieser Plattform kompilieren und ausführen, können Sie nicht garantieren, dass der Dateiinhalt korrekt gelesen wird, da verschiedene Plattformen unterschiedliche Endianness haben können (und daher Integerdaten unterschiedlich speichern) und auch das Padding von Structs unterschiedlich sein kann (sodass die Anzahl der Bytes, die dasselbe Struct belegt, unterschiedlich sein kann und auch die Position des age-Members nach dem name-Member unterschiedlich sein kann). Durch die Verwendung des Programms readrec zum Lesen des Inhalts der Datei recfile wird gezeigt, dass das Programm writerec die Datensätze tatsächlich erfolgreich in recfile geschrieben hat.

Der aus recfile gelesene Inhalt ist wie folgt:

Name1: Ken    Age1: 24
Name2: Knuth  Age2: 28

Beispiele für fwrite- und fread-Anwendungen:

1. Eine Zeichenkette in eine Datei schreiben:

char *str="hello,I am a test program!";  
fwrite(str,sizeof(char),strlen(str),fp)  

2. Ein Zeichenarray in eine Datei schreiben:

char str[]={'a','b','c','d','e'};  
fwrite(str,sizeof(char),sizeof(str),fp)  

3. Ein Integerarray in eine Datei schreiben:

int a[]={12,33,23,24,12};

Zuerst die Anzahl der Array-Elemente nmemb berechnen, dann

fwrite(a,sizeof(int),nmemb,fp)

Hinweis: Da die vom Programm erzeugte Datei eine Binärdatei und keine Textdatei ist, werden Integer auf verschiedenen Maschinen unterschiedlich dargestellt, daher kann die erzeugte Datei nicht direkt geöffnet werden. Sie können die Funktion fread verwenden, um zu überprüfen, ob die Daten in die Datei geschrieben wurden.

Ursprüngliche URL: http://purpleroom.blog.sohu.com/133812394.html