Definition | #include <stdio.h> FILE *fopen(const char *d_name, const char *art); FILE *fopen64(const char *d_name, const char *art);
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:
const char *art Zeichenkette, die die gewünschte Zugriffsart angibt. Mit optionalen Zusatzangaben können weitere Funktionen gesteuert werden:
Zugriffsarten:
Tabulatorzeichen (\t) Im Parameter art kann zusätzlich zur Zugriffsart eine Angabe zur Behandlung des Tabulatorzeichens (\t) gemacht werden. Diese Angabe ist nur für Textdateien mit den Zugriffsmethoden SAM und ISAM relevant. "...,tabexp=yes" Das Tabulatorzeichen wird in die entsprechende Anzahl Leerzeichen expandiert. "...,tabexp=no" Das Tabulatorzeichen wird nicht expandiert. Last Byte Pointer (LBP) Im Parameter art kann zusätzlich zur Zugriffsart eine Angabe zur Behandlung des Last Byte Pointer (LBP) gemacht werden. Diese Angabe ist nur für Binärdateien mit Zugriffsart PAM relevant. Falls Beim Öffnen und Lesen einer bestehenden Datei wird der LBP unabhängig vom lbp-Schalter immer berücksichtigt:
"...,lbp=yes" 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. "...,lbp=no" 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. Wird der Schalter lbp 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
Die Funktion verhält sich so, als ob Split/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. "...,split=yes"
"...,split=no" Beim Lesen werden Sätze maximaler Länge nicht mit dem darauffolgenden Satz verkettet. Beim Schreiben mit einer der Funktionen Wird der Schalter nicht angegeben, gilt "...,split=yes". | |||||||||||||||||||||||||||||||||||||||||
Returnwert | Zeiger auf die zugewiesene FILE-Struktur | |||||||||||||||||||||||||||||||||||||||||
bei Erfolg. | ||||||||||||||||||||||||||||||||||||||||||
| NULL-Zeiger | wenn die Datei nicht geöffnet werden konnte, z.B. wegen fehlender Zugriffsberechtigung, falschem Datei- oder Linknamen etc. | ||||||||||||||||||||||||||||||||||||||||
Hinweise | Der BS2000-Dateiname bzw. -Linkname kann in Klein- und Großbuchstaben geschrieben werden, er wird automatisch in Großbuchstaben umgesetzt. Durch die Angabe eines "b" an zweiter bzw. dritter Stelle im Parameter art wird die Datei als Binärdatei geöffnet. Die Angabe ist nur für SAM-Dateien relevant, da nur SAM-Dateien sowohl im Binär- als auch im Textmodus verarbeitet werden. Systemdateien und ISAM-Dateien werden immer als Textdateien verarbeitet. Die Angabe des Binärmodus führt bei diesen Dateien zu einem Fehler beim Öffnen. (INCORE)- und PAM-Dateien werden immer als Binärdateien verarbeitet. Aus Kompatibilitätsgründen funktioniert das Öffnen als Binärdatei auch ohne explizite Angabe des Binärmodus. 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 auch Abschnitt "Katalogisierte Plattendateien (SAM, ISAM, PAM)“. In allen Fällen, in denen der alte Inhalt einer bereits existierenden Datei gelöscht wird (geöffnet zum Neuschreiben bzw. zum Neuschreiben und Lesen), bleiben die Katalogeigenschaften dieser Datei erhalten. Wenn eine Datei zum Ändern geöffnet wird, kann das Lesen und Schreiben über denselben Dateizeiger erfolgen. Dennoch sollte auf eine Ausgabe nicht unmittelbar eine Eingabe erfolgen ohne ein vorhergehendes Positionieren ( Position des Schreib-/Lesezeigers im Anfügemodus: Wenn der Schreib-/Lesezeiger in einer Datei, die im Anfügemodus eröffnet wurde, explizit vom Dateiende wegpositioniert wurde ( Der Versuch, eine nicht existierende Datei zum Lesen zu öffnen, endet mit Fehler. (INCORE)-Dateien können nur zum Neuschreiben ("w"), zum Neuschreiben und Lesen ("w+r") oder zum Lesen ("r") eröffnet werden. Es müssen zuerst Daten geschrieben werden. Um die geschriebenen Daten wieder einlesen zu können, gibt es folgende Möglichkeiten: Wurde die Datei nur zum Neuschreiben eröffnet, kann man sie mit der Funktion Sie können eine Datei gleichzeitig für verschiedene Zugriffsmodi eröffnen, sofern diese Modi im BS2000-Datenverwaltungssystem miteinander verträglich sind. Wenn ein Programm startet, werden ihm automatisch drei Dateizeiger für Standardeingabe, -ausgabe und -fehlerausgabe zugeordnet und zwar:
Es können maximal _NFILE Dateien gleichzeitig geöffnet sein. _NFILE ist in <stdio.h> mit 2048 definiert. | |||||||||||||||||||||||||||||||||||||||||
Satz-E/A | Für das Eröffnen von Dateien mit Satz-E/A ist der Parameter art um zwei Angaben erweitert.
Fehlt die Angabe von Fehlt die Angabe von Für die Satz-E/A gelten folgende Einschränkungen. Werden diese Einschränkungen nicht eingehalten, wird die Datei nicht eröffnet und ein Fehler-Returnwert geliefert:
| |||||||||||||||||||||||||||||||||||||||||
Beispiel | /* Programm zum Kopieren von dat1 und dat2 auf dat3 */ #include <stdio.h> #include <stdlib.h> FILE *fp_1, *fp_2; void copy(void); int main(void) /* dat1" und dat2 müssen existieren */ { if((fp_1 = fopen("dat1","r")) == NULL ?? (fp_2 = fopen("dat3","w")) ==NULL) { /* Programmabbruch bei Fehler mit Rückgabewert 1 */ perror("fopen"); exit(1); } copy(); /* Umhängen des Dateizeigers von dat1 auf dat2 */ if((freopen("dat2","r",fp_1)) == NULL) /* Programmabbruch bei Fehler mit Rückgabewert 2 */ exit(2); copy(); fclose(fp_1); fclose(fp_2); return 0; } void copy(void) { int c; while((c = getc(fp_1)) != EOF) putc((char)c,fp_2); } | |||||||||||||||||||||||||||||||||||||||||
Siehe auch | creat, creat64, fdopen, freopen, freopen64, ferror, open, open64, fclose, fseek, fseek64 |