Namensräume
Varianten
Aktionen

FILE

Von cppreference.com
< c‎ | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
FILE

Funktionen
Datei-Zugriff
(C95)
Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <stdio.h>
typedef /* unspecified */ FILE;

Jedes FILE-Objekt bezeichnet einen C-Stream.

Der C-Standard spezifiziert nicht, ob FILE ein vollständiger Objekttyp ist. Während es möglich sein mag, eine gültige FILE zu kopieren, ruft die Verwendung eines Zeigers auf eine solche Kopie als Argument für eine I/O-Funktion ein nicht spezifiziertes Verhalten hervor. Anders ausgedrückt, FILE ist möglicherweise semantisch nicht kopierbar.

I/O-Streams können sowohl für unformatierte als auch für formatierte Ein- und Ausgaben verwendet werden. Darüber hinaus können die Funktionen, die Ein- und Ausgaben behandeln, auch lokalitätssensitiv sein, sodass bei Bedarf Weit-/Mehrbyte-Konvertierungen durchgeführt werden.

Inhalt

[bearbeiten] Stream-Zustand

Neben den systemspezifischen Informationen, die für den Zugriff auf das Gerät erforderlich sind (z. B. ein POSIX-Dateideskriptor), enthält jedes FILE-Objekt direkt oder indirekt Folgendes:

  1. (C95) Zeichenbreite: unset, schmal oder breit.
  2. (C95) Parse-Zustand für Konvertierungen zwischen Mehrbyte- und Weitzeichen (ein Objekt vom Typ mbstate_t)
  3. Pufferzustand: ungepuffert, zeilenweise gepuffert, voll gepuffert.
  4. Der Puffer, der durch einen externen, vom Benutzer bereitgestellten Puffer ersetzt werden kann.
  5. I/O-Modus: Eingabe, Ausgabe oder Aktualisierung (sowohl Eingabe als auch Ausgabe).
  6. Binär-/Textmodus-Indikator.
  7. End-of-File-Statusanzeige.
  8. Fehlerstatusanzeige.
  9. Dateipositionsanzeige, zugänglich als Objekt vom Typ fpos_t, das für breite Streams den Parse-Zustand enthält.
  10. (C11) Reentranter Lock, der verwendet wird, um Datenrennen zu verhindern, wenn mehrere Threads einen Stream lesen, schreiben, positionieren oder seine Position abfragen.

[bearbeiten] Schmale und breite Ausrichtung

Ein neu geöffneter Stream hat keine Ausrichtung. Der erste Aufruf von fwide oder einer beliebigen I/O-Funktion legt die Ausrichtung fest: Eine breite I/O-Funktion macht den Stream breit-orientiert; eine schmale I/O-Funktion macht den Stream schmal-orientiert. Sobald sie festgelegt ist, kann die Ausrichtung nur mit freopen geändert werden. Schmale I/O-Funktionen können nicht auf einem breit-orientierten Stream aufgerufen werden; breite I/O-Funktionen können nicht auf einem schmal-orientierten Stream aufgerufen werden. Breite I/O-Funktionen konvertieren zwischen breiten und Mehrbyte-Zeichen, als ob mbrtowc oder wcrtomb mit dem Konvertierungszustand aufgerufen würden, wie er vom Stream beschrieben wird. Im Gegensatz zu Mehrbyte-Zeichenketten, die in einem Programm gültig sind, können Mehrbyte-Zeichensequenzen in der Datei eingebettete Nullzeichen enthalten und müssen nicht im initialen Verschiebungszustand beginnen oder enden.

Der Konvertierungszustand eines Streams mit breiter Ausrichtung wird durch die C-Locale festgelegt, die zum Zeitpunkt der Festlegung der Ausrichtung des Streams installiert ist.

[bearbeiten] Binäre und Textmodi

Ein Text-Stream ist eine geordnete Sequenz von Zeichen, die sich zu Zeilen zusammensetzen lassen; eine Zeile kann in null oder mehr Zeichen plus ein abschließendes '\n' ("Newline")-Zeichen zerlegt werden. Ob die letzte Zeile ein abschließendes '\n' erfordert, ist implementierungsabhängig. Darüber hinaus müssen Zeichen bei der Ein- und Ausgabe möglicherweise hinzugefügt, geändert oder gelöscht werden, um den Konventionen für die Darstellung von Text im Betriebssystem zu entsprechen (insbesondere konvertieren C-Streams unter Windows OS '\n' bei der Ausgabe in '\r\n' und konvertieren '\r\n' bei der Eingabe in '\n').

Daten, die aus einem Text-Stream gelesen werden, verhalten sich garantiert gleich zu den Daten, die zuvor in diesen Stream geschrieben wurden, nur wenn eine der folgenden Bedingungen erfüllt ist:

  • Die Daten bestehen nur aus druckbaren Zeichen und/oder den Steuerzeichen '\t' und '\n' (insbesondere beendet unter Windows OS das Zeichen '\0x1A' die Eingabe).
  • Kein '\n'-Zeichen wird unmittelbar von Leerzeichen gefolgt (solche Leerzeichen können verschwinden, wenn eine solche Ausgabe später als Eingabe gelesen wird).
  • Das letzte Zeichen ist '\n'.

Ein binärer Stream ist eine geordnete Sequenz von Zeichen, die interne Daten transparent aufzeichnen kann. Daten, die aus einem binären Stream gelesen werden, sind immer gleich den Daten, die zuvor in diesen Stream geschrieben wurden, mit der Ausnahme, dass eine Implementierung eine unbestimmte Anzahl von Nullzeichen am Ende des Streams anhängen darf. Ein breiter binärer Stream muss nicht im anfänglichen Verschiebungszustand enden.

[bearbeiten] Notizen

POSIX verlangt ausdrücklich, dass die LC_CTYPE-Facet der aktuell installierten C-Locale im FILE-Objekt gespeichert wird, sobald die Ausrichtung des Streams breit wird; POSIX verlangt, dass diese LC_CTYPE-Facet für alle zukünftigen I/Os auf diesem Stream verwendet wird, bis die Ausrichtung geändert wird, unabhängig von einem späteren Aufruf von setlocale.

Es ist beabsichtigt, dass jede Textzeile aus Daten besteht, die im Wesentlichen menschenlesbar sind. POSIX-Implementierungen unterscheiden nicht zwischen Text- und binären Streams (es gibt keine spezielle Zuordnung für '\n' oder andere Zeichen).

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.21 Eingabe/Ausgabe <stdio.h> (S. 217-247)
  • 7.29 Erweiterte Mehrbyte- und Weitzeichen-Dienstprogramme <wchar.h> (S. 295-325)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.21 Ein-/Ausgabe <stdio.h> (S: 296-339)
  • 7.29 Erweiterte Multibyte- und Wide-Zeichen-Dienstprogramme <wchar.h> (S. 402-446)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.19 Eingabe/Ausgabe <stdio.h> (S. 262-305)
  • 7.24 Erweiterte Multibyte- und Wide-Zeichen-Dienstprogramme <wchar.h> (S. 348-392)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.9 EINGABE/AUSGABE <stdio.h>

[bearbeiten] Siehe auch

Ausdruck vom Typ FILE*, der mit dem Eingabestream verbunden ist
Ausdruck vom Typ FILE*, der mit dem Ausgabestream verbunden ist
Ausdruck vom Typ FILE*, der mit dem Fehlerausgabestream verbunden ist
(Makrokonstante) [bearbeiten]