Namensräume
Varianten
Aktionen

std::FILE

Von cppreference.com
< cpp‎ | io‎ | c
 
 
 
C-Style I/O
Typen und Objekte
FILE

Funktionen
Datei-Zugriff
Direkte Ein-/Ausgabe
Unformatierte Ein-/Ausgabe
Formatierte Eingabe
(C++11)(C++11)(C++11)    
(C++11)(C++11)(C++11)    
 
Definiert in Header <cstdio>
typedef /* nicht spezifiziert */ FILE;

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

Der C-Standard (auf den der C++-Standard verweist) spezifiziert nicht, ob std::FILE ein vollständiger Objekttyp ist. Obwohl es möglich sein kann, eine gültige std::FILE-Instanz 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 ist semantisch möglicherweise nicht kopierbar.

I/O-Streams können sowohl für unformatierte als auch für formatierte Ein- und Ausgabe verwendet werden. Darüber hinaus können die Funktionen, die Ein- und Ausgabe behandeln, auch lokalitätsempfindlich sein, so dass bei Bedarf Weit-/Mehrbytekonvertierungen durchgeführt werden.

Inhalt

[bearbeiten] Stream-Status

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

  1. Zeichenbreite: nicht gesetzt, schmal oder weit.
  2. Parse-Status für Konvertierungen zwischen Mehrbyte- und Weit-Zeichen (ein Objekt vom Typ std::mbstate_t)
  3. Pufferstatus: ungepuffert, zeilen­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-Status­indikator.
  8. Fehlerstatus­indikator.
  9. Dateipositions­indikator, zugänglich als Objekt vom Typ std::fpos_t, der für Weit-Streams den Parse-Status enthält.
  10. (C++17) Rekursiv sperren, um Daten­rennen zu verhindern, wenn mehrere Threads einen Stream lesen, schreiben, positionieren oder seine Position abfragen.

[bearbeiten] Schmal- und Weit-Orientierung

Ein neu geöffneter Stream hat keine Orientierung. Der erste Aufruf von std::fwide oder einer beliebigen I/O-Funktion legt die Orientierung fest: Eine Weit-I/O-Funktion macht den Stream Weit-orientiert; eine Schmal-I/O-Funktion macht den Stream Schmal-orientiert. Sobald sie festgelegt ist, kann die Orientierung nur noch mit std::freopen geändert werden. Schmal-I/O-Funktionen können nicht für einen Weit-orientierten Stream aufgerufen werden; Weit-I/O-Funktionen können nicht für einen Schmal-orientierten Stream aufgerufen werden. Weit-I/O-Funktionen konvertieren zwischen Weit- und Mehrbyte-Zeichen, als ob std::mbrtowc oder std::wcrtomb mit dem von dem Stream beschriebenen Konvertierungsstatus aufgerufen würden. 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 Verschiebungs­status beginnen oder enden.

Der Konvertierungs­status eines Streams mit Weit-Orientierung wird durch die C-Locale bestimmt, die zum Zeitpunkt der Festlegung der Stream-Orientierung installiert ist.

[bearbeiten] Binär- und Textmodi

Ein Textstream ist eine geordnete Sequenz von Zeichen, die zu Zeilen zusammengesetzt werden können; eine Zeile kann in null oder mehr Zeichen plus ein abschließendes '\n' ("Zeilenumbruch") Zeichen zerlegt werden. Ob die letzte Zeile einen abschließenden '\n' benötigt, ist implementierungs­abhä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').

Die Daten, die aus einem Textstream gelesen werden, sind garantiert nur dann identisch mit den Daten, die zuvor in diesen Stream geschrieben wurden, wenn jede 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 solche Ausgaben später als Eingabe gelesen werden).
  • Das letzte Zeichen ist '\n'.

Ein Binärstream ist eine geordnete Sequenz von Zeichen, die interne Daten transparent aufzeichnen kann. Daten, die aus einem Binärstream gelesen werden, sind immer identisch mit 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 Weit-Binärstream muss nicht im initialen Verschiebungs­status enden.

[bearbeiten] Hinweise

POSIX verlangt ausdrücklich, dass die LC_CTYPE-Facet der aktuell installierten C-Locale innerhalb des FILE-Objekts gespeichert wird, sobald die Orientierung des Streams auf weit gesetzt wird; POSIX verlangt, dass diese LC_CTYPE-Facet für alle zukünftigen I/O-Operationen auf diesem Stream verwendet wird, bis die Orientierung geändert wird, unabhängig von einem späteren Aufruf von std::setlocale.

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

[bearbeiten] Siehe auch

abstrahiert ein Rohgerät
(class template) [bearbeiten]
implementiert rohe Datei-Geräte
(Klassen-Template) [bearbeiten]
Ausdruck vom Typ FILE*, der dem Eingabestrom zugeordnet ist
Ausdruck vom Typ FILE*, der dem Ausgabestrom zugeordnet ist
Ausdruck vom Typ FILE*, der dem Fehlerstrom zugeordnet ist
(Makrokonstante) [bearbeiten]
C-Dokumentation für FILE