Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

read - Aus einer Datei einlesen (elementar)

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

int read(int dk, char *puf, int anz);

read ist die elementare Einleseoperation.

read liest aus der Datei mit Dateikennzahl dk maximal anz Zeichen in den Bereich, auf den puf zeigt.

Bei Textdateien liest read pro Aufruf nur die Zeichen innerhalb einer Zeile. Ein Zeilenende beendet die Eingabe.
Bei Binärdateien liest read über Neue-Zeile-Zeichen (\n) hinweg.
SAM-Dateien werden mit elementaren Funktionen stets als Textdateien verarbeitet.

Parameter

int dk

Dateikennzahl der Eingabedatei.
Eine Dateikennzahl (positive ganze Zahl) ist das Ergebnis eines erfolgreichen Aufrufs von open/open64 oder creat/creat64. Die Dateikennzahlen für stdin (0), stdout (1) und stderr (2) sind nach Programmstart automatisch zugeordnet.

char *puf

Zeiger auf den Bereich, in den die gelesenen Daten geschrieben werden sollen. Er sollte mindestens anz Bytes groß sein.

int anz

Maximale Anzahl der Bytes, die gelesen werden sollen. Wird vorher das Zeilenende erreicht, werden weniger als anz Bytes eingelesen.

Returnwert

Anzahl der tatsächlich gelesenen Bytes



bei Erfolg.

 

0

bei Dateiende.

 

-1

read hat nichts gelesen, weil einer der folgenden Fehler vorliegt:

  • physikalischer Ein-/Ausgabefehler

  • dk ist keine gültige Dateikennzahl

  • die Datei ist nicht vorhanden

  • es besteht kein Zugriffsrecht auf die Datei

  • anz ist nicht möglich

Hinweise

Die Anzahl der tatsächlich gelesenen Bytes kann kleiner sein als die Angabe in anz, wenn vorher Zeilenende erreicht wird (nur bei Textdateien), sowie bei Dateiende oder Fehler.

Um sicherzugehen, dass nicht mehr Bytes gelesen werden, als der Puffer aufnehmen kann, sollten Sie sizeof verwenden.

Bei Textdateien mit der Zugriffsart SAM und variabler Satzlänge, für die zusätzlich eine maximale Satzlänge angegeben ist, gilt: Wenn bei open die Angabe O_NOSPLIT gemacht wurde, werden Sätze maximaler Länge beim Lesen nicht mit dem darauffolgenden Satz verkettet. Standardmäßig (also ohne die Angabe O_NOSPLIT) 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.

Bei Dateien mit satzorientierter Ein-/Ausgabe (Satz-E/A), d.h. wenn bei open die Angabe O_RECORD gemacht wurde, liest die Funktion read einen Satz (bzw. Block) von der aktuellen Dateiposition. Ist die Anzahl n der zu lesenden Zeichen 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 gelesen. Beim nächsten Lesezugriff werden die Daten des nächsten Satzes gelesen.

Beispiel

Folgendes Programm kopiert die Standardeingabe (Dateikennzahl 0) auf die Standardausgabe (Dateikennzahl 1). Wenn Sie den Umlenkmechanismus für stdin und stdout
ausnutzen (PARAMETER-PROMPTING in der RUNTIME-Option), können Sie damit von einer beliebigen Quelle auf ein beliebiges Ziel kopieren. BUFSIZ (8192 Bytes) ist in der Include-Datei <stdio.h> definiert.

#include <stdio.h>
int main(void)
{
  char buf[BUFSIZ];
  int n;
  while((n = read(0, buf, sizeof(buf))) > 0)
        write(1, buf, n);
  return 0;
}

Siehe auch

write, open, open64, creat, creat64