Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

fopen, fopen64 - Datei öffnen

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

FILE *fopen(const char *d_name, const char *art); FILE *fopen64(const char *d_name, const char *art);

fopen und fopen64 öffnen die Datei d_name und weisen ihr eine FILE-Struktur und einen Dateizeiger zu. Der Dateizeiger zeigt auf die zugewiesene FILE-Struktur. Die FILE-Struktur ist in der Datei <stdio.h> definiert. Sie enthält notwendige Information für die meisten Funktionen aus der Standard-Ein-/Ausgabebibliothek.

Es besteht kein funktionaler Unterschied zwischen fopen und fopen64, außer dass in der mit dem Filedescriptor verknüpften Dateibeschreibung das Kennzeichen für eine große Datei hinterlegt wird, dh. es wird das O_LARGEFILE Bit gesetzt. Es wird ein Dateizeiger zurückgegeben, der dazu verwendet werden kann, die Datei über 2 GB hinaus zu vergrößern.

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

const char *art

Zeichenkette, die die gewünschte Zugriffsart angibt. Mit optionalen Zusatzangaben können weitere Funktionen gesteuert werden:

Zusatzangabe

Funktion

tabexp=yes/no

Behandlung des Tabulatorzeichens (\t)

lbp=yes/no

Behandlung des Last Byte Pointers (LBP)

split=yes/no

Verarbeitung von Textdateien mit der Angabe einer maximalen Satzlänge

Zugriffsarten:

"r"

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

"w"

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

"wx"

Öffnen Textdatei zum Neuschreiben. Die Datei darf noch nicht vorhanden sein.

"a"

Öffnen Textdatei zum Anfügen ans Ende der Datei. Ist die Datei vorhanden,
wird auf das Dateiende positioniert, d.h. der alte Inhalt bleibt erhalten und die
neuen Daten werden ans Ende der Datei angehängt. Ist die Datei nicht
vorhanden, wird sie neu erstellt.

"rb"

Öffnen Binärdatei zum Lesen. Die Datei muss bereits vorhanden sein.

"wb"

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

"wbx"

Öffnen Binärdatei zum Neuschreiben. Die Datei darf noch nicht vorhanden sein.

"ab"

Öffnen Binärdatei zum Anfügen ans Ende der Datei. Ist die Datei vorhanden,
wird auf das Dateiende positioniert, d.h. der alte Inhalt bleibt erhalten und die
neuen Daten werden ans Ende der Datei angehängt. Ist die Datei nicht
vorhanden, wird sie neu erstellt.

"r+w", "r+"

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

"w+r", "w+"

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

"w+x"

Öffnen Textdatei zum Neuschreiben und Lesen.
Die Datei darf noch nicht vorhanden sein.

"a+r", "a+"

Öffnen Textdatei zum Anfügen ans Ende der Datei und zum Lesen. Ist die
Datei vorhanden, bleibt der alte Inhalt erhalten und die neuen Daten werden
ans Ende der Datei angehängt. Eine bereits vorhandene Datei ist nach dem
Öffnen je nach KR- oder ANSI-Funktionalität unterschiedlich positioniert:
bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden) auf
das Dateiende,
bei ANSI-Funktionalität auf den Dateianfang.
Ist die Datei nicht vorhanden, wird sie neu erstellt.

"r+b", "rb+"

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

"w+b", "wb+"

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

"w+bx", "wb+x"

Öffnen Binärdatei zum Neuschreiben und Lesen.
Die Datei darf noch nicht vorhanden sein.

"a+b", "ab+"

Öffnen Binärdatei zum Anfügen ans Ende der Datei und zum Lesen.
Ist die Datei vorhanden, bleibt der alte Inhalt erhalten und die neuen Daten
werden ans Ende der Datei angehängt. Eine bereits vorhandene Datei ist
nach dem Öffnen je nach KR- oder ANSI-Funktionalität unterschiedlich
positioniert:
bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden) auf
das Dateiende,
bei ANSI-Funktionalität auf den Dateianfang.
Ist die Datei nicht vorhanden, wird sie neu erstellt.

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.
Voreinstellung bei KR-Funktionalität (KR-Funktionalität nur bei C/C++ Versionen kleiner V3.0 vorhanden).

"...,tabexp=no"

Das Tabulatorzeichen wird nicht expandiert.
Voreinstellung bei ANSI-Funktionalität.

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 lbp=yes angegeben ist, wird geprüft, ob LBP-Unterstützung möglich ist. Ist dies nicht der Fall, so schlägt die Funktion fopen, fopen64 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.

"...,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.
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.

"...,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.
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 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))):

LAST_BYTE_POINTER=YES

Die Funktion verhält sich so, als ob lbp=yes angegeben wäre.

LAST_BYTE_POINTER=NO

Die Funktion verhält sich so, als ob lbp=no angegeben wäre.

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"

      • Beim Lesen gilt: 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.

      • Beim Schreiben gilt: 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.

"...,split=no"

Beim Lesen werden Sätze maximaler Länge nicht mit dem darauffolgenden Satz verkettet. Beim Schreiben mit einer der Funktionen fwrite, fprintf, printf, vfprintfvprintf, fwprintf, wprintf, vfwprintf, vwprintf, fputs, fputws und puts werden Sätze, die länger als die maximale Satzlänge sind, auf die maximale Satzlänge gekürzt.

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:


Binärdatei

Textdatei

Zugriffsmethode

SAM

SAM (KR-Funktionalität, nur bei C/C++-Versionen kleiner V3.0 vorhanden)
ISAM (ANSI-Funktionalität)

Satzformat

F

V

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 (fseek/fseek64, fsetpos/fsetpos64, rewind) oder einen fflush-Aufruf. Dasselbe gilt für eine Ausgabe, die einer Eingabe folgt.

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 (rewind, fsetpos/fsetpos64, fseek/fseek64), 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, 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 freopen bzw. freopen64 zum Lesen öffnen. Wurde die Datei zum Neuschreiben und zum Lesen eröffnet, kann man den Lese-/Schreibzeiger mit der Funktion rewind auf Dateianfang positionieren.

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:

stdin

Dateizeiger für Standardeingabe (Datensichtstation)

stdout

Dateizeiger für Standardausgabe (Datensichtstation)

stderr

Dateizeiger für Standardfehlerausgabe (Datensichtstation)

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.
Diese Angaben folgen in der Zeichenkette hinter der Zugriffsart (s.o.) jeweils durch ein
Komma getrennt.

"...,type=record [,forg={seq/key}]"              

type=record

Die Datei wird für satzweise Ein-/Ausgabe eröffnet
Fehlt diese Angabe, wird die Datei für Strom-E/A eröffnet.

forg=seq

Die Dateiorganisation ist sequenziell.
Sequenzielle Dateien können SAM- oder PAM-Dateien sein.

forg=key

Die Dateiorganisation ist indexsequenziell.
Indexsequenzielle Dateien sind ISAM-Dateien.

Fehlt die Angabe von forg, ist die Dateiorganisation vom FCBTYP der Datei abhängig:
Der FCBTYP ist durch den Katalogeintrag einer bereits existierenden Datei festgelegt bzw. durch ein ADD-FILE-LINK-Kommando. Für SAM- und PAM-Dateien wird sequenzielle Dateiorganisation angenommen, für ISAM-Dateien indexsequenzielle Dateiorganisation.

Fehlt die Angabe von forg und der FCPTYP ist nicht festgelegt (Datei nicht vorhanden, kein ADD-FILE-LINK-Kommando), wird sequenzielle Dateiorganisation angenommen und eine SAM-Datei erstellt.

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:

  1. Die Datei muss im Binärmodus eröffnet werden (Angabe "b" bei der Zugriffsart).

  2. "type=record" ist zulässig für SAM-, PAM- oder ISAM-Dateien.

  3. "forg=seq" ist zulässig für SAM- oder PAM-Dateien, "forg=key" für ISAM-Dateien.

  4. Bei ISAM-Dateien ist der Anfügemodus ’a’ unzulässig. Die Position bestimmt sich aus
    dem Schlüssel im Satz.

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