Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

fwrite - Blockweise in eine Datei schreiben

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

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

fwrite schreibt anz Elemente von jeweils elgroesse Bytes Größe aus dem Bereich, auf den zg zeigt, in die Datei mit Dateizeiger dz.
Die Position des Lese-/Schreibzeigers ist anschließend um die Anzahl der geschriebenen Bytes erhöht.

Returnwert

Anzahl der tatsächlich geschriebenen Elemente



bei Erfolg.

 

0

bei Dateiende oder Fehler.         

Hinweise

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

Bei der Ausgabe in Dateien mit Strom-E/A werden die Daten nicht sofort in die externe Datei geschrieben, sondern in einem C-internen Puffer zwischengespeichert (siehe Abschnitt „Pufferung“ (Grundbegriffe)).

Bei der Ausgabe in Textdateien werden die Steuerzeichen für Zwischenraum (\n, \t, etc.) je nach Art der Textdatei in ihre entsprechende Wirkung umgesetzt (siehe Abschnitt „Zwischenraum“ (Grundbegriffe)).

Satz-E/A

fwrite schreibt einen Satz in die Datei.

Bei sequenziellen Dateien (SAM, PAM) wird der Satz an die aktuelle Dateiposition geschrieben. Bei indexsequenziellen Dateien (ISAM) wird der Satz an die Position geschrieben, die dem Schlüsselwert im Satz entspricht.

Anzahl der auszugebenden Zeichen:

Im Folgenden sei n die Gesamtanzahl der auszugebenden Zeichen, d.h.

n = Elementlänge * Elementanzahl

Ist n größer als die maximale Satzlänge, wird nur ein Satz mit maximaler Satzlänge geschrieben. Die restlichen Daten gehen verloren.

Ist n kleiner als die minimale Satzlänge, wird kein Satz geschrieben. Die minimale Satzlänge ist nur für ISAM-Dateien definiert und bedeutet, dass n mindestens den Bereich des Schlüssels im Satz umfassen muss.

Ist n beim Neuschreiben eines Satzes in eine Datei mit fester Satzlänge kleiner als die Satzlänge, wird der Satz am Ende mit binären Nullen aufgefüllt.

Beim Update eines bestehenden Satzes in einer sequenziellen Datei (SAM, PAM) muss n gleich der Länge des zu aktualisierenden Satzes sein. Im anderen Fall tritt ein Fehler auf. Als Satzlänge für PAM-Dateien gilt die Länge eines logischen Blocks.

Beim Update eines bestehenden Satzes in einer indexsequenziellen Datei (ISAM) braucht n nicht gleich der Länge des zu aktualisierenden Satzes sein. Ein Satz kann also verkürzt oder verlängert werden.

In ISAM-Dateien, für die Schlüsselverdoppelung zugelassen ist, ist kein direkter Update eines Satzes möglich. Beim Schreiben eines Satzes mit einem bereits existierenden Schlüssel wird stets ein neuer Satz geschrieben. Der alte Satz muss explizit gelöscht werden.

fwrite liefert den gleichen Returnwert wie bei Strom-E/A, nämlich die Anzahl der vollständig geschriebenen 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 geschriebenen Satzes entspricht (ohne ein ggf. vorhandenes Satzlängenfeld). Bei fester Satzlänge wird jedoch das (ggf. notwendige) Auffüllen mit binären Nullen im Returnwert nicht berücksichtigt.

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, die länger als die maximale Satzlänge sind, beim Schreiben auf die maximale Satzlänge gekürzt. Standardmäßig oder mit der Angabe split=yes werden diese Sätze in mehrere Sätze aufgeteilt. Hat ein Satz genau die maximale Satzlänge, wird nach diesem ein Satz der Länge Null geschrieben.

 

Beispiel

Folgendes Programm überträgt zwei Personeneinträge auf die Datei mit Dateizeiger p_list.

#include <stdio.h>
int main(void)
{
  FILE *p_list;
  size_t result;
  static struct p
  {
    char name[20];
    int a;
  } person[2] =
    {
      {"ANNE", 30},
      {"HANS", 60},
    };
  p_list = fopen("link=link", "w");
  result = fwrite(person, sizeof(struct p), 2, p_list);
  printf("%d Personeneintraege geschrieben\n", result);
  return 0;
}

Siehe auch

fread, feof, ferror