Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Grundbegriffe

&pagelevel(3)&pagelevel

Dieses Kapitel enthält die ausführliche Erklärung von Dateiverarbeitungsbegriffen, die bei der Beschreibung der C-Ein-/Ausgabefunktionen im Nachschlageteil häufig benutzt werden. Die Begriffe sind in alphabetischer Reihenfolge aufgeführt.

Binärdatei

Eine Binärdatei ist eine geordnete Folge von Bytes. Die mit den C-Ausgabefunktionen geschriebenen Daten werden 1:1 in die Datei übernommen. Im Unterschied zu Textdateien werden Steuerzeichen für Zeilenvorschub und Tabulatoren nicht in ihre Wirkung umgesetzt (siehe "Textdatei"), sondern als entsprechende EBCDIC-Werte abgebildet.
Daten, die aus einer Binärdatei eingelesen werden, entsprechen daher genau den Daten, die ursprünglich in die Datei geschrieben wurden.

Binärdateien mit Strom-E/A sind:

  • katalogisierte PAM-Dateien,

  • temporäre PAM-Dateien (INCORE),

  • katalogisierte SAM-Dateien, die mit fopen/fopen64 bzw. freopen/freopen64 im Binärmodus eröffnet wurden.

Binärdateien mit Satz-E/A sind:

  • katalogisierte ISAM-Dateien,

  • katalogisierte SAM-Dateien,

  • katalogisierte PAM-Dateien,

wenn sie auf eine der folgenden Arten eröffnet wurden:

  • mit den Funktionen fopen/fopen64 bzw. freopen/freopen64 im Binärmodus und mit dem Zusatz "type=record" oder

  • mit den Funktionen open/open64 bzw. creat/creat64 und der Angabe O_RECORD.

Der Binärmodus kann mit den Funktionen fopen/fopen64 bzw. freopen/freopen64 angegeben werden und mit den Funktionen open/open64 bzw. creat/creat64, falls O_RECORD angegeben ist.

Beim Arbeiten mit den ASCII-Varianten der Ein-/Ausgabefunktionen und Binärdateien ist Folgendes zu beachten:

Da die Daten mit C-Eingabefunktionen 1:1 in eine Binärdatei geschrieben und mit C-Ausgabefunktionen in genau diesem Format wieder ausgelesen werden, sind bei Programmen, die mit Binärdateien arbeiten, ggf. Anpassungen erforderlich. Dies ist u.a. bei der Verarbeitung von Textbestandteilen der Fall. Wurde beispielsweise bei einer ISAM-Datei der Schlüssel als EBCDIC-Zeichenkette abgelegt, dann ist sicherzustellen, dass bei einem Zeichenkettenvergleich nicht EBCDIC-Code mit ASCII-Code verglichen wird.

Dateikennzahl

Eine Dateikennzahl ist eine positive ganze Zahl. Sie dient dazu, eine Datei bei der Verarbeitung mit elementaren Zugriffsfunktionen zu identifizieren. Beim Öffnen (mit open/open64, creat/creat64) wird einer Datei eine Dateikennzahl zugewiesen. Bei allen weiteren Zugriffen (read, write, close, tell etc.) wird die Dateikennzahl als Dateiargument benutzt.

Bei Programmstart sind die Standard-Ein-/Ausgabedateien automatisch mit folgenden Dateikennzahlen geöffnet:

0

1

2

Standardeingabe

Standardausgabe

Standard-Fehlerausgabe

Dateizeiger

Ein Dateizeiger ist ein Zeiger auf eine Struktur vom Typ FILE. Er dient dazu, eine Datei mit den Standard-Zugriffsfunktionen (siehe <stdio.h>) zu verarbeiten. Beim Öffnen (mit fopen/fopen64, fdopen, freopen/freopen64) wird einer Datei ein Dateizeiger zugewiesen. Bei weiteren Zugriffen (fprintf, fwprintf, fscanf, fclose etc.) wird der Dateizeiger als Dateiargument benutzt.

Bei Programmstart sind die Standard-Ein-/Ausgabedateien automatisch mit folgenden Dateizeigern geöffnet:

stdin

stdout

stderr

(Standardeingabe)

(Standardausgabe)

(Standard-Fehlerausgabe)

elementar

Als „elementar“ werden alle Funktionen bezeichnet, die eine Datei auf der Basis von Dateikennzahlen verarbeiten. Im Unterschied dazu gibt es die Standard-Ein-/Ausgabefunktionen, die alle auf der Basis von Dateizeigern arbeiten. Außerdem lassen sich mit den elementaren Funktionen SAM-Dateien nur dann auch als Binärdateien verarbeiten, wenn O_RECORD angegeben ist. Anderfalls können sie nur als Textdateien veratbeitet werden.

In vielen anderen Implementierungen (z.B. UNIX, SINIX) sind die elementaren Funktionen als Systemaufrufe realisiert und unterscheiden sich von den Standardfunktionen durch größere Systemnähe und bessere Performance. Diesen Unterschied zwischen Systemaufruf und Funktion gibt es im BS2000 nicht.

FILE-Struktur

Einer Datei, die mit fopen/fopen64, fdopen oder freopen/freopen64 geöffnet wird, ist automatisch ab diesem Zeitpunkt eine bestimmte Struktur vom Typ FILE zugeordnet. Diese Struktur ist in <stdio.h> definiert.

Sie enthält u.a. folgende Informationen über die Datei:

  • Zeiger auf den Ein-/Ausgabepuffer,

  • Puffergröße,

  • Position des Lese-/Schreibzeigers,

  • Größe der Datei.

Der von fopen/fopen64, fdopen oder freopen/freopen64 gelieferte Dateizeiger verweist auf diese FILE-Struktur.

Lese-/Schreibzeiger

Der Lese-/Schreibzeiger enthält Informationen über die aktuelle Position einer Datei. Daten werden jeweils ab dieser aktuellen Position gelesen bzw. geschrieben.
Die Information im Lese-/Schreibzeiger ist je nach Dateiart unterschiedlich aufgebaut:

  • Bei Binärdateien mit Strom-E/A entspricht sie der Anzahl Bytes vom Dateianfang gerechnet.

  • Bei Textdateien enthält sie Informationen über den aktuellen Satz und die Position innerhalb des Satzes. Der Aufbau ist für SAM- und ISAM-Dateien unterschiedlich. Die Information wird vom Laufzeitsystem intern verwendet.

  • Bei Binärdateien mit Satz-E/A entspricht sie der Position hinter dem zuletzt gelesenen, geschriebenen oder gelöschten Satz bzw. der Position, die durch ein unmittelbar vorangegangenes Positionieren erreicht wurde.

  • Bei ISAM-Dateien mit Schlüsselverdoppelung ist der Lese-/Schreibzeiger hinter dem letzten Satz einer Gruppe mit gleichen Schlüsseln positioniert, wenn einer dieser Sätze zuvor gelesen, geschrieben oder gelöscht wurde.

Pufferung

Bei allen Ausgabefunktionen, die Daten in Textdateien und Binärdateien mit Strom-E/A schreiben (printf, putc, fwrite etc.), werden die Daten in einem C-internen Puffer zwischengespeichert und erst in die externe Datei geschrieben, wenn ein bestimmtes Ereignis eintritt. Dieses unterscheidet sich bei Text- und Binärdateien.

Textdatei:

  1. Ein Neue-Zeile-Zeichen (\n) wird erkannt,

  2. die maximale Satzlänge einer Plattendatei ist erreicht,

  3. bei Datensichtstationen: nach einer Ausgabe auf die Datensichtstation folgt eine Eingabe von der Datensichtstation,

  4. die Positionier-Funktionen fseek/fseek64, fsetpos/fsetpos64, rewind oder lseek/lseek64 werden aufgerufen,

  5. die Funktion fflush wird aufgerufen; fflush wird intern automatisch ausgeführt, wenn eine Datei geschlossen wird (fclose, close) oder wenn ein Programm normal bzw. mit exit beendet wird.

  6. die Datei wird geschlossen,

  7. zusätzlich bei ANSI-Funktionalität: Wenn das Lesen aus einer beliebigen Textdatei eine Datenübertragung von der externen Datei in den C-internen Puffer notwendig macht, werden die noch in Puffern zwischengespeicherten Daten aller ISAM-Dateien automatisch in die Dateien hinausgeschrieben.

Auch wenn die Daten im Puffer nicht mit einem Neue-Zeile-Zeichen enden, bewirkt das Schreiben in die externe Datei einen Zeilenwechsel. Nachfolgende Daten werden in eine neue Zeile (bzw. in einen neuen Satz) geschrieben.

Ausnahme bei ANSI-Funktionalität:
Wenn die Daten einer ISAM-Datei im Puffer nicht mit einem Neue-Zeile-Zeichen enden, bewirkt das Schreiben in die externe Datei keinen Zeilenwechsel (bzw. Satzwechsel).

Nachfolgende Daten verlängern den Satz in der Datei. Beim Lesen einer ISAM-Datei werden daher nur Neue-Zeile-Zeichen eingelesen, die vom Programm explizit geschrieben wurden.

Binärdatei:

  1. der Puffer ist voll,

  2. die Positionier-Funktionen fseek/fseek64, fsetpos/fsetpos64, rewind oder lseek/lseek64 werden aufgerufen,

  3. die Funktion fflush wird aufgerufen (s.o. Textdatei)

  4. die Datei wird geschlossen.

Die Zwischenpufferung entfällt bei INCORE-Dateien und generell bei Dateien mit Satz-E/A.

Satzorientierte-Ein-/Ausgabe

Satzorientierte Ein-/Ausgabe bedeutet, dass sich der Lese-/Schreibzeiger der Datei jeweils nur auf den Beginn eines Satzes (bzw. Blockes) positionieren lässt. Satzorientierte Ein-/Ausgabe ermöglicht eine der BS2000-Struktur angepasste performante Dateiverarbeitung. Die Einheit für einen Ein-/Ausgabe-Funktionsaufruf ist stets ein Satz (bzw. Block). Es stehen zusätzliche Funktionen zur Verfügung wie Löschen und Einfügen von Sätzen, Zugriff auf den Schlüssel in ISAM-Dateien.

Satzorientiert können katalogisierte SAM-, ISAM- und PAM-Dateien verarbeitet werden. Die Dateien müssen auf eine der folgenden Arten eröffnet werden:

  • mit den Funktionen fopen/fopen64 bzw. freopen/freopen64 mit dem Zusatz "type=record" im art-Parameter und stets im Binärmodus.

  • mit den Funktionen open/open64 und der Angabe O_RECORD.

U.a. sind Ein-/Ausgabefunktionen, die Zeichen oder Zeichenketten (bis \n) einlesen und ausgeben, auf Dateien mit Satz-E/A nicht anwendbar.

Folgende Funktionen dienen zur Verarbeitung von Dateien mit Satz-E/A:

close, creat/creat64, fopen/fopen64,
freopen/freopen64, fclose, open/open64

Öffnen, Schließen

fread, fwrite, read, write

Lesen, Schreiben

fsetpos/fsetpo64, fgetpos/fgetpos64, flocate,
fseek/fseek64, lseek/lseek64, rewind

Positionieren

fdelrec

Löschen Satz

Außerdem sind folgende Funktionen zur Dateiverwaltung bzw. Fehlerbehandlung unverändert anwendbar:

feof, ferror, _fnlinserted, clearerr, unlink, remove, rename

Im Gegensatz zur Strom-E/A werden bei Satz-E/A keine Daten im Puffer zwischengespeichert (siehe "Pufferung").

Stromorientierte Ein-/Ausgabe

Stromorientierte Ein-/Ausgabe bedeutet, dass sich der Lese-/Schreibzeiger auf jedes einzelne Byte in der Datei positionieren lässt. Strom-E/A ist der herkömmliche Verarbeitungsmodus und standardmäßig eingestellt, d.h. ohne besondere Zusatzangaben bei den Eröffnungsfunktionen. Textdateien können ausschließlich in diesem E/A-Modus verarbeitet werden.
Im Gegensatz zur Satz-E/A werden bei der Ausgabe in Dateien mit Strom-E/A die Daten zunächst in einem C-internen Puffer zwischengespeichert und erst später in die externe Datei geschrieben (siehe "Pufferung").

Textdatei

Textdateien gibt es nur für Strom-E/A.

Folgende Dateiarten werden als Textdateien behandelt:

  • katalogisierte SAM-Dateien (kein Binärmodus beim Öffnen),

  • katalogisierte ISAM-Dateien,

  • Systemdateien (SYSDTA, SYSOUT, SYSLST, SYSTERM).

Eine Textdatei ist eine geordnete Folge von Bytes, die zu Zeilen (bzw. Sätzen) zusammengefasst sind. Im Unterschied zu Binärdateien werden die Steuerzeichen für Zwischenraum je nach Art der Textdatei in ihre entsprechende Wirkung umgesetzt (siehe "Zwischenraum"). Daten, die aus einer Textdatei eingelesen werden, entsprechen daher nicht genau den Daten, die ursprünglich in die Datei geschrieben wurden. Für einen geschriebenen Tabulator (\t) wird eine entsprechende Anzahl von Leerzeichen gelesen.

Zusätzlich gibt es bei Textdateien noch Folgendes zu beachten:

  • Es können Neue-Zeile-Zeichen eingelesen werden, die ursprünglich nicht in die Datei geschrieben wurden (siehe fflush, fseek/fseek64, fsetpos/fsetpos64, lseek/lseek64, rewind).

  • Ausgabe auf SYSOUT und SYSTERM (zum Schreiben)
    Jede Zeile wird mit einem Leerzeichen als Drucksteuerzeichen begonnen. Dies bewirkt einen Zeilenvorschub.

  • Ausgabe auf SYSLST
    Nur wenn keines der Steuerzeichen \f, \v, \r oder \b in einer Zeile angegeben wird, beginnt die Zeile mit einem Leerzeichen als Drucksteuerzeichen.

  • Der Inhalt einer Textdatei wird stets als eine Folge von EBCDIC-Zeichen interpretiert. Bei der Verarbeitung von Textdateien mit der ASCII-Variante einer E/A-Funktion (siehe "C-Bibliotheksfunktionen, die ASCII-Codierung unterstützen") wird deshalb intern wie folgt konvertiert:

    • Beim Schreiben in die Datei: Konverierung von ASCII nach EBCDIC

    • Beim Lesen aus der Datei: Konvertierung von EBCDIC nach ASCII

Zwischenraum

Die Steuerzeichen für Zwischenraum sowie das Kontrollzeichen ’\b’ (vgl. Tabelle unten) werden von allen Ausgabefunktionen ausgewertet, die in Textdateien schreiben und als Argument das Steuerzeichen entweder als Zeichenkonstante (beginnend mit \) oder als numerischen EBCDIC-Wert erhalten. Die dezimalen bzw. sedezimalen Werte der Steuerzeichen finden Sie in den C- und C++-Benutzerhandbüchern (EBCDIC-Tabelle).

In der folgenden Tabelle bedeutet

X

Steuerzeichen wird in die entsprechende Wirkung umgesetzt

leer

Steuerzeichen wird als Textzeichen (EBCDIC-Wert) in die Datei geschrieben


 \n 

 \t 

 \f 

 \v 

 \r 

 \b 

SAM/ISAM

X

X





SYSOUT/SYSTERM

X

X

X




SYSLST

X

X

X

X

X

X

Tabulator(\t)

Das Tabulatorzeichen wird in die entsprechende Anzahl Leerzeichen umgesetzt. Die Tabulatorpositionen haben einen Acht-Spalten-Abstand (1, 9, 17, ...). Statt des Tabulatorzeichens werden die entsprechenden Leerzeichen eingelesen.

In SAM- und ISAM-Dateien wird das Tabulatorzeichen bei KR-Funktionalität standardmäßig in Leerzeichen umgesetzt (KR-Funktionalität ist nur in C/C++ Versionen kleiner V3.0 vorhanden).
bei ANSI-Funktionalität dagegen nicht (siehe Zusatzangabe "tabexp" bei den Funktionen fopen/fopen64, freopen/freopen64).

Zeilenvorschub (\n)

Das Neue-Zeile-Zeichen wird in einen Zeilenwechsel (Satzwechsel) umgesetzt. Anschließende Lesefunktionen liefern dann für einen Satzwechsel ein Neue-Zeile-Zeichen.

Seitenvorschub (\f)

SYSLST: Es wird ein Seitenvorschub durchgeführt, die folgenden Daten werden auf einer neuen Seite ausgegeben.
SYSOUT, SYSTERM zum Schreiben: An der Datensichtstation wird die Meldung„please acknowledge“ ausgegeben.

Vertikaler Tabulator (\v)

Es wird eine entsprechende Anzahl von Leerzeilen ausgegeben, um die nächste Zeilen-Tabulatorposition zu erreichen. Diese Tabulatorpositionen haben einen Acht-Zeilen-Abstand (1, 9, 17, ...).

Wagenrücklauf (\r)

Es wird ohne Zeilenvorschub an den Beginn der aktuellen Zeile positioniert, d.h. die folgenden Daten werden in die gleiche Zeile geschrieben. Damit lässt sich z.B. eine Unterstreichung erzielen.

Zeichen rücksetzen (\b)

Das nachfolgende Zeichen wird auf die Position des vorhergehenden Zeichens geschrieben. Damit kann z.B. ein Buchstabe mit einem Akzent versehen werden.
\b zählt nicht im engeren Sinne zu den Zwischenraumzeichen (vgl. isspace) sondern zu den Kontrollzeichen (vgl. iscntrl).

Die Verwendung von \r und \b ist nur sinnvoll bei Druckern mit Überdruckfunktion.