Video: How to green the world's deserts and reverse climate change | Allan Savory 2024
Wenn Sie eine Datei öffnen, indem Sie entweder eine ofstream- oder ifstream-Instanz erstellen, können Sie die Art und Weise, wie die Datei geöffnet wird, ändern, indem Sie sogenannte Flags bereitstellen. In Computerbegriffen ist ein -Flag einfach ein kleiner Gegenstand, dessen Vorhandensein oder Nichtvorhandensein einer Funktion sagt, wie etwas zu tun ist. Bei den Klassen vonstream und ifstream ist die fragliche Funktion der Konstruktor.
Ein Flag sieht wie ios:: app aus, wenn Sie einen Compiler verwenden, der nicht vollständig ANSI-kompatibel ist, oder wie ios_base:: app aussieht, wenn Sie einen verwenden, der vollständig ANSI-kompatibel ist. Dieses spezielle Flag bedeutet, dass Sie in eine Datei schreiben möchten, aber Sie möchten an vorhandene Daten anhängen, die sich möglicherweise bereits in einer Datei befinden. Sie geben dieses Flag als Argument des Konstruktors für ofstream an, wie in einem der folgenden Beispiele:
ofstream-Ausgabedatei ("AppendableFile.txt", ios:: app); ofstream-Ausgabedatei ("AppendableFile.txt", ios_base:: app);
Sie können sehen, dass das Flag als zweiter Parameter zum Konstruktor hinzugefügt wird. Neben der App gibt es noch andere Flags, die Sie mit dem Operator oder, | kombinieren können. Zum Beispiel ist ein Flag ios:: nocreate (das nicht in neueren Compilern enthalten ist).
Das bedeutet: "Öffnen Sie die Datei nur, wenn sie bereits existiert. "Das heißt, erstellen Sie die Datei nicht, wenn sie nicht existiert. (Denken Sie daran, dass ofstream eine Datei erstellt, falls diese noch nicht existiert.) Wenn die Datei nicht existiert, schlägt das Öffnen fehl, und wenn Sie einen Aufruf fehlschlagen, erhalten Sie eine echte zurück.
Das ios:: nocreate-Flag ist praktisch für ios:: app. Zusammen bedeuten diese eine vorhandene Datei öffnen und an diese anhängen . Das heißt, die beiden zusammen funktionieren nur, wenn die Datei bereits existiert und der Aufruf die Datei für eine Append-Operation öffnet. Wenn die Datei noch nicht existiert, wird die Datei nicht erstellt. Hier ein Beispielaufruf:
ofstream outfile ("… / MeineDatei. Txt", ios:: app | ios:: nocreate); if (outfile. fail ()) {cout << "konnte die Datei nicht öffnen!" << endl; return 0;} outfile << "hi" << endl; Ausgangsdatei. schließen();
Wenn MeineDatei. txt existiert nicht, wenn Sie diesen Code ausführen, erhalten Sie die Meldung Konnte die Datei nicht öffnen! Aber wenn MyFile. txt existiert, die Anwendung öffnet sie, hängt die Zeichenfolge Hi an und schließt sie schließlich.
Es stellt sich heraus, dass das Nocreate-Flag in der neuen Standard Library nicht verfügbar ist. Schade. Daher funktioniert der Code nur, wenn Sie eine frühere Version der Bibliothek verwenden. Wenn Sie den Compiler Code:: Blocks verwenden, wird folgende Fehlermeldung Ihnen angezeigt:
Fehler: 'nocreate' ist kein Mitglied von '; std:: ios '
Sie sollten jedoch testen, ob Ihr spezieller Compiler eine Bibliothek enthält, die ios:: nocreate unterstützt.Ihr Compiler kann es trotzdem unterstützen, selbst wenn es die neue Standardbibliothek enthält. Als Alternative zu ios:: nocreate können Sie den folgenden Code verwenden (zu finden im Beispiel FileOutput02):
ifstream infile ("… / MyFile. Txt"); if (infile. fail ()) {cout << "konnte die Datei nicht öffnen!" << endl; return 0;} infile. schließen(); ofstream outfile ("… / MeineDatei. txt", ios:: app); outfile << "Hallo" << Ende; Ausgangsdatei. schließen();
In diesem Fall beginnen Sie mit dem Versuch, die Datei zum Lesen zu öffnen. Wenn die Datei nicht existiert, können Sie nicht lesen und der Code wird mit einer Fehlermeldung beendet. Wenn der Code aus der Datei lesen kann, wird die Datei zum Schreiben erneut geöffnet. Das ist eine umständliche Problemumgehung, aber es funktioniert.
Es folgt eine Liste der verfügbaren Flags. Erstens, hier sind die für ios, für den Fall, dass Sie einen Compiler verwenden, der nicht vollständig ANSI-kompatibel ist:
-
ios:: app: Dieses Flag bedeutet, dass Sie eine Datei öffnen und an diese anhängen möchten.
-
ios:: in: Schließen Sie dieses Flag ein, wenn Sie aus einer Datei lesen möchten.
-
ios:: out : Fügen Sie dieses Flag ein, wenn Sie in eine Datei schreiben möchten.
-
ios:: trunc : Fügen Sie dieses Flag ein, wenn Sie den Inhalt der Datei vor dem Schreiben löschen wollen. Es ist das Gegenteil von append, und es ist auch die Standardeinstellung, wenn Sie ios:: app nicht speziell einschließen.
-
ios:: nocreate : Verwenden Sie dieses Flag, wenn Sie sicherstellen möchten, dass die Datei nicht erstellt wird, wenn sie nicht existiert, was dazu führt, dass die Datei nicht geöffnet wird.
-
ios:: noreplace : Dieses Flag ist das Gegenteil von nocreate. Verwenden Sie dieses Flag, wenn Sie nur eine neue Datei erstellen möchten. Wenn Sie dieses Flag verwenden und die Datei bereits vorhanden ist, wird die Datei nicht geöffnet, und dieser Fehler wird true zurückgeben.
ANSI-kompatible Compiler unterstützen das Flag ios:: noreplace nicht. In diesem Fall können Sie das Gegenteil des Fixes für das ios: nocreate -Flag verwenden, wie hier gezeigt (und im FileOutput03-Beispiel gefunden):
ifstream infile ("… / MyFile. Txt"); if (! infile. fail ()) {cout << "Die Datei existiert bereits!" << endl; return 0;} infile. schließen(); ofstream outfile ("… / MeineDatei. txt"); outfile << "Hallo" << Ende; Ausgangsdatei. schließen();
In diesem Fall versucht der Code, die Datei zum Lesen zu öffnen. Wenn die Datei existiert, zeigt der Code eine Fehlermeldung an und wird beendet. Andernfalls erstellt der Code eine neue Datei und schreibt sie.
Die folgenden Flags sind in einem Compliant verfügbar, der absolut ANSI-konform ist!
-
ios:: ate: Verwenden Sie dieses Flag, um nach dem Öffnen zum Ende der Datei zu wechseln. Normalerweise verwenden Sie dieses Flag, wenn Sie Daten an die Datei anhängen möchten.
-
ios_base:: binary: Verwenden Sie dieses Flag, um anzugeben, dass die Datei, die Sie öffnen, binäre Daten enthält - also Daten, die keine Zeichenfolgen darstellen.
-
ios_base:: in: Geben Sie dieses Flag an, wenn Sie aus einer Datei lesen möchten.
-
ios_base:: out: Fügen Sie dieses Flag hinzu, wenn Sie in eine Datei schreiben möchten.
-
ios_base:: trunc: Fügen Sie dieses Flag ein, wenn Sie den Inhalt einer Datei löschen wollen, bevor Sie sie schreiben.
-
ios_base:: app: Schließen Sie dieses Flag ein, wenn Sie an die Datei anhängen möchten. Es ist das Gegenteil von trunc - das heißt, die Informationen, die sich beim Öffnen bereits in der Datei befinden, bleiben dort.
Warum benötigen Sie eine In-Flag und eine Out-Flag? Es scheint, dass der Computer wissen sollte, ob Sie in eine Datei schreiben oder aus ihr lesen, abhängig davon, ob Sie Stream oder Ifstream verwenden. Die Antwort darauf, warum Sie eine In-Flag und eine Out-Flag haben, ist, dass neben Stream und Ifstream auch andere Klassen verfügbar sind.
Die Compiler, die den ANSI-Standard noch nicht vollständig unterstützen, haben in ihren Bibliotheken eine generische Klasse namens fstream. Die ANSI-kompatiblen Compiler haben in ihren Bibliotheken eine Vorlagenklasse namens basic_filebuf und eine Klasse namens filebuf. Wenn Sie diese Klassen verwenden, können Sie die In- und Out-Flags verwenden.