Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

open, open64 - Datei öffnen (elementar)

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

int open(const char *d_name, int modus); int open64(const char *d_name, int modus);

open und open64 öffnen die Datei d_name. Die Zugriffsart hängt von dem (oktalen) Wert von modus ab. open und open64 geben eine gültige Dateikennzahl zurück, die später in elementaren Zugriffsoperationen (read, write) zur Bezeichnung der Datei benutzt wird.

Es besteht kein funktionaler Unterschied zwischen open und open64, außer dass open64 im File Status Flag implizit das Bit O_LARGEFILE setzt. Die Funktion open64 entspricht der Verwendung der Funktion open, bei der O_LARGEFILE in oflag gesetzt ist.

Für die Bearbeitung von Dateien > 2 GB verfahren Sie wie folgt:

Parameter

const char *d_name

Zeichenkette, die die zu öffnende Datei angibt. d_name kann sein:

      • jeder gültige BS2000-Dateiname
      • "link=linkname" linkname bezeichnet einen BS2000-Linknamen
      • "(SYSDTA)", "(SYSOUT)", "(SYSLST)" die entsprechende Systemdatei
      • "(SYSTERM)" Terminal-Ein-/Ausgabe
      • "(INCORE)" temporäre Binärdatei, die nur im virtuellen Speicher angelegt wird

int modus

Konstante, die im Header <stdio.h> definiert ist und die gewünschte Zugriffsart angibt, (oder die entsprechende Oktalzahl) und zwar:

O_RDONLY
0000

Öffnen zum Lesen. Die Datei muss bereits vorhanden sein.

O_WRONLY
0001

Öffnen zum Schreiben. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten.

O_TRUNC|O_WRONLY
01001

Öffnen zum Schreiben. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt.

O_RDWR
0002

Öffnen zum Lesen und Schreiben. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten.

O_TRUNC|O_RDWR
01002

Öffnen zum Lesen und Schreiben. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt.

O_WRRD
0003

Öffnen zum Neuschreiben und Lesen. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt.

O_APPEND_OLD|O_TRUNC|O_WRONLY
0401

Öffnen zum Anfügen ans Ende der Datei. Die Datei muss bereits vorhanden sein. Es wird auf das Dateiende positioniert, d.h. der alte Inhalt bleibt erhalten und der neue Text wird ans Ende der Datei angehängt.

O_APPEND_OLD|O_RDWR
0402

Öffnen zum Anfügen ans Ende der Datei und zum Lesen. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten und der neue Text wird ans Ende der Datei angehängt. Nach dem Öffnen ist die Datei bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden) auf das Dateiende positioniert, bei ANSI-Funktionalität auf den Dateianfang.

lbp-Schalter

Der lbp-Schalter steuert die Behandlung des Last Byte Pointers (LBP). Er ist nur für Binärdateien mit Zugriffsart PAM relevant und kann mit jeder der oben angegebenen Konstanten kombiniert werden. Falls als lbp-Schalter O_LBP angegeben ist, wird geprüft, ob LBP-Unterstützung möglich ist. Ist dies nicht der Fall, so schlägt die Funktion open, open64 fehl und errno wird auf ENOSYS gesetzt. Weitere Auswirkungen hat der Schalter erst, wenn die Datei geschlossen wird.

Beim Öffnen und Lesen einer bestehenden Datei wird der LBP unabhängig vom lbp-Schalter immer berücksichtigt:

      • Ist der LBP der Datei ungleich 0, wird er ausgewertet. Ein eventuell vorhandener Marker wird ignoriert.

      • Ist der LBP = 0, wird nach einem Marker gesucht und die Dateilänge daraus ermittelt. Falls kein Marker gefunden wird, wird das Ende des letzten vollständigen Blocks als Dateiende betrachtet.

O_LBP

Beim Schließen einer Datei, die verändert oder neu erstellt wurde, wird kein Marker geschrieben (auch wenn einer vorhanden war) und ein gültiger LBP gesetzt. Auf diese Weise können Dateien mit Marker auf LBP ohne Marker umgestellt werden.Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.

O_NOLBP

Beim Schließen einer Datei, die neu erstellt wurde, wird der LBP auf Null (=ungültig) gesetzt. Es wird ein Marker geschrieben. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.

Beim Schließen einer Datei, die verändert wurde, wird der LBP auf Null (=ungültig) gesetzt. Ein Marker wird nur dann geschrieben, wenn vorher bereits ein Marker vorhanden war. Falls die Datei beim Öffnen einen gültigen LBP besaß, wird kein Marker geschrieben, da in diesem Fall davon ausgegangen wird, dass kein Marker vorhanden ist. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.

Wird der lbp-Schalter in beiden Varianten angegeben (O_LBP und O_NOLBP), so schlägt die Funktion open, open64 fehl und errno wird auf EINVAL gesetzt.

Wird der lbp-Schalter nicht angegeben, hängt das Verhalten von der Umgebungsvariablen LAST_BYTE_POINTER ab (siehe auch "Umgebungsvariable LAST_BYTE_POINTER“ (Last Byte Pointer (LBP))):

LAST_BYTE_POINTER=YES

Die Funktion verhält sich so, als ob O_LBP angegeben wäre.

LAST_BYTE_POINTER=NO

Die Funktion verhält sich so, als ob O_NOLBP angegeben wäre.

Nosplit-Schalter

Dieser Schalter steuert die Verarbeitung von Textdateien mit der Zugriffsart SAM und variabler Satzlänge, wenn zusätzlich eine maximale Satzlänge angegeben ist. Er kann mit jeder der anderen Konstanten kombiniert werden.

O_NOSPLIT

Beim Lesen mit read werden Sätze maximaler Länge nicht mit dem darauffolgenden Satz verkettet. Beim Schreiben mit write werden Sätze, die länger als die maximale Satzlänge sind, auf die maximale Satzlänge gekürzt.

Ist der Schalter nicht angegeben, gilt Folgendes:

      • Beim Schreiben Ein Satz, der länger als die maximale Satzlänge ist, wird in mehrere Sätze aufgeteilt. Hat ein Satz genau die maximale Satzlänge, wird nach diesem ein Satz der Länge Null geschrieben.

      • Beim Lesen Hat ein Satz die maximale Satzlänge, wird angenommen, dass es sich bei dem Folgesatz um die Fortsetzung dieses Satzes handelt und die Sätze werden verkettet.

Returnwert

Dateikennzahl

positive Zahl, die später bei den elementaren Zugriffsoperationen (read, write) zum Bezeichnen der Datei benutzt wird.

 

-1

wenn die Datei nicht geöffnet werden konnte, z.B. wegen fehlender Zugriffsberechtigung, falschem Datei- oder Linknamen etc.

Satz-E/A

Zum Eröffnen von Dateien mit satzorientierter Ein-/Ausgabe (Satz-E/A) kann beim Parameter modus die Konstante O_RECORD angegeben werden. Sie kann grundsätzlich mit jeder anderen Konstanten außer O_LBP kombiniert werden. Lediglich bei ISAM-Dateien ist das Anfügen an das Ende der Datei nicht erlaubt, also die Kombination mit 0401 und 0402. Bei ISAM-Dateien bestimmt sich die Position aus dem Schlüssel im Satz.

O_RECORD

Dieser Schalter bewirkt Folgendes:

          • Die Funktion read liest bei Satz-E/A 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.

          • Die Funktion write schreibt einen Satz in die Datei. Bei SAM- und PAM-Dateien wird der Satz an die aktuelle Dateiposition geschrieben. Bei ISAM-Dateien wird der Satz an die Position geschrieben, die dem Schlüsselwert im Satz entspricht. Ist die Anzahl n der zu schreibenden Zeichen größer als die maximale Satzlänge, wird nur ein Satz mit maximaler Satzlänge geschrieben. Die restlichen Daten gehen verloren. Bei ISAM-Dateien wird ein Satz nur geschrieben, wenn er mindestens einen vollständigen Schlüssel enthält. Ist bei Dateien mit fester Satzlänge n kleiner als die Satzlänge, wird mit binären Nullen aufgefüllt. Beim Update eines Satzes in einer SAM- oder PAM-Datei darf die Länge des Satzes nicht verändert werden. Die Funktion write liefert auch bei Satz-E/A die Anzahl der tatsächlich geschriebenen Zeichen zurück. 

Hinweise

Der BS2000-Dateiname bzw. -Linkname kann in Klein- und Großbuchstaben geschrieben werden, er wird automatisch in Großbuchstaben umgesetzt.

Wird eine nicht vorhandene Datei neu angelegt, wird standardmäßig folgende Datei erzeugt:
Bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden) eine SAM-Datei mit variabler Satzlänge und Standardblocklänge, bei ANSI-Funktionalität eine ISAM-Datei mit variabler Satzlänge und Standardblocklänge.
SAM-Dateien sind beim Öffnen mit open bzw. open64 immer Textdateien.

Bei Verwendung eines Linknamens lassen sich mit dem ADD-FILE-LINK-Kommando folgende Dateiattribute ändern: Zugriffsmethode, Satzlänge, Satzformat, Blocklänge und Blockformat (siehe Abschnitt "Systemdateien (SYSDTA, SYSOUT, SYSLST)“).

In allen Fällen, in denen der alte Inhalt einer bereits existierenden Datei gelöscht wird (0003, 01001), bleiben die Katalogeigenschaften dieser Datei erhalten.

Position des Schreib-/Lesezeigers im Anfügemodus:
Wenn der Schreib-/Lesezeiger in einer Datei, die im Anfügemodus eröffnet wurde (0401, 0402), explizit vom Dateiende wegpositioniert wurde (lseek/lseek64), wird er je nach KR- oder ANSI-Funktionalität unterschiedlich behandelt.
KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden): Der aktuelle Schreib/Lesezeiger wird nur beim Schreiben mit der Elementarfunktion write ignoriert und automatisch ans Ende der Datei positioniert.
ANSI-Funktionalität: Der aktuelle Schreib-/Lesezeiger wird bei allen Schreibfunktionen ignoriert und automatisch ans Ende der Datei positioniert.

Der Versuch, eine nicht existierende Datei zum Lesen zu öffnen (0000, 0002), zum Ändern (0001) sowie zum Anfügen (0401, 0402), endet mit Fehler.

Sie können eine Datei gleichzeitig für verschiedene Zugriffsmodi eröffnen, sofern diese Modi im BS2000-Datenverwaltungssystem miteinander verträglich sind.

(INCORE)-Dateien können nur zum Neuschreiben (01001) oder zum Neuschreiben und Lesen (0003) eröffnet werden. Es müssen zuerst Daten geschrieben werden. Um die geschriebenen Daten wieder einlesen zu können, muss die Datei mit der Funktion lseek/lseek64 auf Dateianfang positioniert werden.

Wenn ein Programm startet, werden die Standarddateien für Eingabe, Ausgabe und Fehlerausgabe automatisch mit folgenden Dateikennzahlen geöffnet:

stdin:

0

stdout:

1

stderr:

2

Es können maximal _NFILE Dateien gleichzeitig geöffnet sein. _NFILE ist in <stdio.h> mit 2048 definiert.

Beispiel

Folgendes Programm öffnet die Datei spass zweimal zum Lesen und verarbeitet sie mit
unterschiedlichen Dateikennzahlen (fd1, fd2).

#include <stdio.h>
int fd1,fd2;
char c;
int n;
int main(void)
{
               /* Datei "spass" das erste Mal
                  zum Lesen öffnen */
   if((fd1=open("spass",0)) == -1)
               /* Fehler beim ersten Öffnen */
      printf("fehler1\n");
               /* Datei "spass"
                  zum zweiten Mal zum Lesen öffnen */
   if((fd2=open("spass",0)) == -1)
               /* Fehler beim zweiten Öffnen */
      printf("fehler2\n");
               /* bis zum ersten 'a' wird über fd1 gelesen */
   while((n=read(fd1,&c,1)) > 0 && (c != 'a'))
               /* Ausgabe des gelesenen Zeichens auf
                  Standardausgabe */
          write(1,&c,n);
               /* jetzt wird über fd2 von Dateianfang!!
                  bis Dateiende gelesen */
   while((n=read(fd2,&c,1)) > 0)
               /* Ausgabe des gelesenen Zeichens auf
                  Standardausgabe */
          write(1,&c,n);
               /* über fd1 wird nach dem ersten 'a'
                  weitergelesen bis Dateiende */
   while((n=read(fd1,&c,1)) > 0)
               /* Ausgabe des gelesenen Zeichens auf
                  Standardausgabe */
          write(1,&c,n);
   return 0;
}

Siehe auch

creat, creat64, fdopen, read, write, close