Definition | #include <stdio.h> int open(const char *d_name, int modus); int open64(const char *d_name, int modus);
Es besteht kein funktionaler Unterschied zwischen 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:
int modus Konstante, die im Header <stdio.h> definiert ist und die gewünschte Zugriffsart angibt, (oder die entsprechende Oktalzahl) und zwar:
Öffnen zum Lesen. Die Datei muss bereits vorhanden sein.
Öffnen zum Schreiben. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten.
Öffnen zum Schreiben. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt.
Öffnen zum Lesen und Schreiben. Die Datei muss bereits vorhanden sein. Der alte Inhalt bleibt erhalten.
Öffnen zum Lesen und Schreiben. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt.
Öffnen zum Neuschreiben und Lesen. Ist die Datei vorhanden, wird der alte Inhalt gelöscht. Ist die Datei nicht vorhanden, wird sie neu erstellt.
Ö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.
Ö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 Beim Öffnen und Lesen einer bestehenden Datei wird der LBP unabhängig vom lbp-Schalter immer berücksichtigt:
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.
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 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))):
Die Funktion verhält sich so, als ob O_LBP angegeben wäre.
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.
Beim Lesen mit Ist der Schalter nicht angegeben, gilt Folgendes:
| |||||||
Returnwert | Dateikennzahl | positive Zahl, die später bei den elementaren Zugriffsoperationen ( | ||||||
| -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
Dieser Schalter bewirkt Folgendes:
| |||||||
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 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: 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 Wenn ein Programm startet, werden die Standarddateien für Eingabe, Ausgabe und Fehlerausgabe automatisch mit folgenden Dateikennzahlen geöffnet:
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 #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 |