Namespaces
Variants

FILE

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

Jedes FILE Objekt bezeichnet einen C-Stream.

Der C-Standard legt nicht fest, ob FILE ein vollständiger Objekttyp ist. Obwohl es möglich sein könnte, ein gültiges 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, FILE könnte semantisch nicht kopierbar sein.

I/O-Streams können sowohl für unformatierten als auch formatierten Eingabe- und Ausgabeoperationen 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 FILE -Objekt direkt oder indirekt Folgendes:

  1. (C95) Zeichenbreite: nicht festgelegt, schmal oder breit.
  2. (C95) Parse-Zustand für Konvertierungen zwischen Multibyte- und Breitzeichen (ein Objekt vom Typ mbstate_t )
  3. Pufferungszustand: ungepuffert, zeilengepuffert, vollständig gepuffert.
  4. Der Puffer, der durch einen externen, benutzerbereitgestellten Puffer ersetzt werden kann.
  5. E/A-Modus: Eingabe, Ausgabe oder Aktualisierung (sowohl Eingabe als auch Ausgabe).
  6. Binär-/Textmodus-Indikator.
  7. Dateiende-Statusindikator.
  8. Fehlerstatusindikator.
  9. Dateipositionsindikator, zugänglich als Objekt vom Typ fpos_t , der für breite Streams den Parse-Zustand enthält.
  10. (C11) Reentrant-Sperre, die verwendet wird, 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 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 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 mbrtowc oder wcrtomb mit dem durch den Stream beschriebenen Konvertierungszustand aufrufen. Im Gegensatz zu den 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 Festlegung der Ausrichtung des Streams 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 ' \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 OS 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 explizit vor, dass die LC_CTYPE Facette des aktuell installierten C-Locale im FILE Objekt gespeichert werden muss, 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 setlocale .

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

Referenzen

  • C17-Standard (ISO/IEC 9899:2018):
  • 7.21 Ein-/Ausgabe <stdio.h> (S: 217-247)
  • 7.29 Erweiterte Multibyte- und Breitzeichen-Utilities <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 Breitzeichen-Funktionen <wchar.h> (S: 402-446)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.19 Ein-/Ausgabe <stdio.h> (S. 262-305)
  • 7.24 Erweiterte Multibyte- und Breitzeichen-Funktionen <wchar.h> (S. 348-392)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 4.9 EINGABE/AUSGABE <stdio.h>

Siehe auch

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)