Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

fread - Blockweise aus einer Datei einlesen

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

size_t fread(void *zg, size_t elgroesse, size_t anz, FILE *dz);

fread liest anz Elemente, die jeweils elgroesse Bytes beanspruchen, aus der Datei mit Dateizeiger dz. Die gelesenen Datenelemente speichert fread in den Bereich, auf dessen Anfang zg zeigt. Nach erfolgreichem Lesen steht der Lese-/Schreibzeiger hinter dem letzten gelesenen Byte.

Returnwert

Anzahl der tatsächlich gelesenen Elemente.

Diese Anzahl kann kleiner als anz sein, wenn ein Fehler auftritt oder Dateiende erreicht wird.

Hinweise

Sie müssen dafür sorgen, dass der Bereich, auf den zg zeigt, zum Abspeichern der eingelesenen Datenelemente ausreicht.

Um sicherzugehen, dass elgroesse die richtige Anzahl Bytes für ein Datenelement angibt, sollten Sie die Funktion sizeof für die Größe der Dateneinheit verwenden, auf die zg zeigt.

fread unterscheidet nicht zwischen Dateiende und Fehler. Sie sollten daher vor bzw. nach jedem fread Aufruf mit den Funktionen feof und ferror überprüfen, ob ein korrekter Lesezugriff möglich ist.

fread liest über Zeilenende (\n) hinweg und eignet sich daher dazu, Binärdateien einzulesen.

Satz-E/A

fread liest einen Satz (bzw. Block) von der aktuellen Dateiposition.

Anzahl der einzulesenden Zeichen: Im Folgenden sei n die Gesamtanzahl der einzulesenden Zeichen, d.h.

n = Elementlänge * Elementanzahl

Ist n größer als die aktuelle Satzlänge, wird trotzdem nur dieser Satz gelesen.
Ist n kleiner als die aktuelle Satzlänge, werden nur die ersten n Zeichen des Satzes
gelesen. Beim nächsten Lesezugriff werden die Daten des nächsten Satzes gelesen.

fread liefert den gleichen Returnwert wie bei Strom-E/A, nämlich die Anzahl der vollständig eingelesenen Elemente. Bei Satz-E/A ist es sinnvoll, auschließlich die Elementlänge 1 zu verwenden, da in diesem Fall der Returnwert der Länge des gelesenen Satzes entspricht (ohne ein ggf. vorhandenes Satzlängenfeld).

Bei Textdateien mit der Zugriffsart SAM und variabler Satzlänge, für die zusätzlich eine maximale Satzlänge angegeben ist, gilt: Wenn bei fopen die Angabe split=no gemacht wurde, werden Sätze maximaler Länge beim Lesen nicht mit dem darauffolgenden Satz verkettet. Standardmäßig oder mit der Angabe split=yes wird beim Lesen eines Satzes mit maximaler Satzlänge angenommen, dass es sich bei dem Folgesatz um die Fortsetzung dieses Satzes handelt, und die Sätze werden verkettet.

Beispiel

Folgendes Programm überträgt zwei Personeneinträge in eine Datei (fwrite) und liest diese Einträge wieder ein (fread).

#include <stdio.h>
int main(void)
{
  FILE *fp;
  size_t result;
  static struct p
  {
    char name[20];
    int a;
  } person[2] =
    {
      {"ANNE", 30},
      {"HANS", 60},
    };
  fp = fopen("link=link", "w+r");
  result = fwrite(person, sizeof(struct p), 2, fp);
  printf("%d Personeneintraege geschrieben\n", result);
  rewind(fp);
  result = fread(person, sizeof(struct p), 2, fp);
  printf("%d Personeneintraege gelesen\n", result);
  printf("Name1: %s, Alter1: %d\n", person[0].name, person[0].a);
  printf("Name2: %s, Alter2: %d\n", person[1].name, person[1].a);
  return 0;
}

Siehe auch  fwrite, feof, ferror, read, fopen, fopen64, fgetc, fgets, fscanf