In welchem ​​Zustand ist eine C ++ Datei-In?

Ein konstruierter C ++ fstream Objekt (einschließlich ifstream und ofstream) Wird ein Proxy für die Datei, dem er zugeordnet ist. Zum Beispiel hält der Stromobjektzustandsinformationen über die I / O-Prozess. Die Member-Funktion schlecht() kehrt zurück wahr Falls etwas # 147-bad # 148- passiert.

Das nebulösen Begriff bedeutet, dass die Datei nicht geöffnet werden konnte, wurde einige interne Objekt durcheinander, oder die Dinge nur allgemein abgespritzt. Ein weniger Fehler fehlschlagen() zeigt an, dass entweder etwas schlecht() passiert ist oder die letzte Lese fehlgeschlagen - zum Beispiel, wenn Sie versuchen, eine zu lesen int und alle das Programm zu finden, ist ein Zeichen, das ein bewertet fehlschlagen() aber nicht ein schlecht(). Die Member-Funktion gut() kehrt zurück wahr wenn sowohl schlecht() und fehlschlagen() sind falsch.

Versuche zur Eingabe von oder die Ausgabe an einen Stream-Objekt, das einen Fehler gesetzt hat, werden ignoriert. Die Member-Funktion klar() Nullen der fehlschlagen Flagge Sie noch eine Chance zu geben, wenn der Fehler nur vorübergehend ist - in der Regel, klar() Clears # 147-Ausfälle # 148- aber nicht # 147-bad # 148- Dinge. Alle Versuche zur Ausgabe an eine ofstream Objekt, das einen Fehler hat keine Auswirkungen.

Dieser letzte Absatz ist ganz wörtlich gemeint - kein Eingang oder Ausgang ist möglich, solange der interne Fehlerzustand des Stream-Objekt Sie verwenden sind nicht Null ist. Das Programm wird nicht einmal versuchen, bis Sie anrufen klar() die Fehler-Flags zu löschen, wenn der Fehler nur vorübergehend ist und Sie können es löschen.

Das folgende Beispielprogramm zeigt, wie über die Verwendung der zu gehen ifstream Klasse eine Reihe von ganzen Zahlen zu extrahieren:

// StreamInput - einfache Eingabe aus einer Datei mit fstream # include #einschließen #einschließen #einschließen using namespace std-ifstream openfile () {ifstream * pFileStream = 0-für (-) {// die Datei von der userstring sFileName-cout angegeben öffnen lt; lt; "Geben Sie den Namen einer Datei mit ganzen Zahlen:" - cin >> sFileName - // offene Datei für readingpFileStream = new ifstream (sFileName.c_str ()) - if (pFileStream-> gut ()) {pFileStream-> seekg (0 ) -cerr lt; lt; "Erfolgreich geöffnet" lt; lt; sFileName lt; lt; Endl-Break-} cerr lt; lt; "Konnte nicht geöffnet werden" lt; lt; sFileName lt; lt; Endl-löschen pFileStream-} return * pFileStream-} int main (int nNumberofArgs, char * pszArgs []) {// erhalten eine Datei streamifstream filestream = openfile () - // stoppen, wenn keine Daten mehr in filewhile {// lesen Sie ein valueint nValue = 0-filestream >> nValue (fileStream.eof ()!) - // stoppen, wenn die Datei (vermutlich fehlgeschlagen lesen, da / / liefen wir auf etwas, das nicht ein int ist oder // weil wir eine neue Zeile mit nichts nach // it) if (fileStream.fail ()) {break -} gefunden // Ausgabe der Wert nur readcout lt; lt; nValue lt; lt; endl-} cout lt; lt; "Drücken Sie die Eingabetaste, um fortzufahren ..." lt; lt; Endl-cin.ignore (10, ' n') - cin.get () - Rückkehr 0-}

Die Funktion Öffne Datei() fragt den Benutzer nach dem Namen einer Datei zu öffnen. Die Funktion erstellt ein ifstream () Objekt mit dem angegebenen Namen. Erstellen eines ifstream Objekt öffnet sich automatisch die Datei für die Eingabe. Wenn die Datei ordnungsgemäß geöffnet wird, gibt die Funktion einen Verweis auf die ifstream Objekt zum Lesen zu verwenden.

Andernfalls löscht das Programm das Objekt und versucht es erneut. Der einzige Weg aus der Schleife zu erhalten, ist eine gültige Dateinamen einzugeben oder das Programm abbrechen.

Vergessen Sie nicht, zu löschen die pFileStream widersprechen, wenn der offene ausfällt. Dies sind die hinterhältige Art und Weise, die Speicherlecks einschleichen.

Das Programm liest Integer-Werte aus dem Objekt referenziert durch filestream bis entweder fehlschlagen() oder das Programm erreicht die End-of-Datei wie sie in der Member-Funktion angezeigt eof ().

Eine letzte Warnung: Nicht nur, dass nichts aus dem Lesen eines Eingangsstrom zurückgeführt, die einen Fehler hat, aber auch der Puffer zurückkommt unverändert. Dieses Programm kann auf dem falschen Schluss leicht gekommen, dass es den gleichen Wert nur gelesen hat es vorher lesen. Außerdem, eof () wird nie eine Rückkehr wahr auf einem Eingangsstrom, der einen Fehler aufweist.

Menü