Namespaces
Variants

std:: FILE

From cppreference.net
< cpp ‎ | io ‎ | c
Definiert im Header <cstdio>
typedef /* unspecified */ FILE ;

Jedes std::FILE Objekt bezeichnet einen C-Stream.

Der C-Standard (auf den der C++-Standard verweist) legt nicht fest, ob std::FILE ein vollständiger Objekttyp ist. Obwohl es möglich sein könnte, ein gültiges std::FILE zu kopieren, ruft die Verwendung eines Zeigers auf eine solche Kopie als Argument für eine I/O-Funktion nicht spezifiziertes Verhalten hervor. Mit anderen Worten, std::FILE könnte semantisch nicht kopierbar sein.

I/O-Streams können sowohl für unformatierte als auch formatierte Eingabe und Ausgabe verwendet werden. Darüber hinaus können die Funktionen, die Eingabe und Ausgabe behandeln, auch gebietsschemabezogen sein, sodass bei Bedarf Breitzeichen-/Multibyte-Konvertierungen durchgeführt werden.

Inhaltsverzeichnis

Stream-Zustand

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

  1. Zeichenbreite: unset, narrow oder wide.
  2. Parse-Zustand für Konvertierungen zwischen Multibyte- und Wide-Zeichen (ein Objekt vom Typ std::mbstate_t )
  3. Pufferungszustand: unbuffered, line-buffered, fully buffered.
  4. Der Puffer, der durch einen externen, benutzerbereitgestellten Puffer ersetzt werden kann.
  5. I/O-Modus: input, output oder update (sowohl Eingabe als auch Ausgabe).
  6. Binär-/Textmodus-Indikator.
  7. Dateiende-Statusindikator.
  8. Fehlerstatusindikator.
  9. Dateipositionsindikator, zugänglich als Objekt vom Typ std::fpos_t , der für Wide-Streams den Parse-Zustand enthält.
  10. (C++17) Reentrant Lock, verwendet um Datenrennen zu verhindern, wenn mehrere Threads einen Stream lesen, schreiben, positionieren oder die Position abfragen.

Enge und weite Ausrichtung

Ein neu geöffneter Stream hat keine Ausrichtung. Der erste Aufruf von std::fwide oder einer beliebigen I/O-Funktion legt die Ausrichtung fest: Eine breite I/O-Funktion macht den Stream breitorientiert; eine schmale I/O-Funktion macht den Stream schmalorientiert. Einmal gesetzt, kann die Ausrichtung nur mit std::freopen geändert werden. Schmale I/O-Funktionen können nicht auf einem breitorientierten Stream aufgerufen werden; breite I/O-Funktionen können nicht auf einem schmalorientierten Stream aufgerufen werden. Breite I/O-Funktionen konvertieren zwischen breiten und Multibyte-Zeichen, als würden sie std::mbrtowc oder std::wcrtomb mit dem durch den Stream beschriebenen Konvertierungszustand aufrufen. Im Gegensatz zu Multibyte-Zeichenketten, die in einem Programm gültig sind, können Multibyte-Zeichensequenzen in der Datei eingebettete Nullzeichen enthalten und müssen nicht im initialen Shift-Zustand beginnen oder enden.

Der Konvertierungszustand eines Streams mit breiter Ausrichtung wird durch das C-Locale festgelegt, das zum Zeitpunkt der Einstellung der Stream-Ausrichtung installiert ist.

Binär- und Textmodi

Ein Textstrom ist eine geordnete Folge von Zeichen, die zu Zeilen zusammengesetzt werden kann; 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 implementierungsdefiniert. Darüber hinaus müssen Zeichen möglicherweise bei der Eingabe und Ausgabe 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 ' \n ' bei der Ausgabe zu ' \r \n ' und konvertieren ' \r \n ' bei der Eingabe zu ' \n ' ).

Daten, die aus einem Textstrom eingelesen werden, sind garantiert gleich mit den Daten, die zuvor in diesen Strom geschrieben wurden, nur wenn jede der folgenden Bedingungen zutrifft:

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

Ein Binärstrom ist eine geordnete Folge von Zeichen, die interne Daten transparent aufzeichnen kann. Daten, die aus einem Binärstrom gelesen werden, entsprechen stets den Daten, die zuvor in diesen Strom geschrieben wurden, mit der Ausnahme, dass eine Implementierung eine unbestimmte Anzahl von Nullzeichen am Ende des Stroms anhängen darf. Ein breiter Binärstrom muss nicht im anfänglichen Schaltzustand enden.

Hinweise

POSIX schreibt ausdrücklich vor, dass die LC_CTYPE Facette des aktuell installierten C-Locale innerhalb des FILE Objekts gespeichert wird, sobald die Ausrichtung des Streams breit wird; POSIX verlangt, dass diese LC_CTYPE Facette für alle zukünftigen E/A-Operationen auf diesem Stream verwendet wird, bis die Ausrichtung geändert wird, unabhängig von nachfolgenden Aufrufen von std::setlocale .

Es ist beabsichtigt, dass jede Textzeile aus im Wesentlichen menschenlesbaren Daten besteht. POSIX-Implementierungen unterscheiden nicht zwischen Text- und Binärströmen (es gibt keine spezielle Abbildung für ' \n ' oder andere Zeichen).

Siehe auch

abstrahiert ein Rohgerät
(Klassentemplate)
implementiert Rohdateigerät
(Klassentemplate)
Ausdruck vom Typ FILE * assoziiert mit dem Eingabestrom
Ausdruck vom Typ FILE * assoziiert mit dem Ausgabestrom
Ausdruck vom Typ FILE * assoziiert mit dem Fehlerausgabestrom
(Makrokonstante)