/ / C ++ Filestream Probleme beim Öffnen der Datei im Lese-Schreib-Modus - C ++, Datei-Handling, Filestreams

C ++ Filestream Probleme beim Öffnen der Datei im Lese-Schreib-Modus - C ++, Datei-Handling, Filestreams

Betrachten Sie das folgende Code-Snippet:

const char * filePath = "C:/blah.mtt";
fstream fs(filePath, ios::in | ios::out | ios::binary);
if (fs.fail())
std::cout << "Failed to open the file!n";

Der fs.fail () - Check ist immer erfolgreich. Bedeutet es, dass ich eine Datei nicht gleichzeitig im Lese-Schreib-Modus öffnen kann?

Wenn Sie zuerst eine leere Datei erstellen und dann den obigen Code ausführen, ist fs.fail () immer false. Was ist der Grund für ein solches Verhalten der fstream-Klasse?

Hinweis: Ich habe die erforderlichen Berechtigungen zum Erstellen der Datei. Ich versuche dies auf Windows 10 mit VS2015

Antworten:

2 für die Antwort № 1

Bedeutet es, dass ich eine Datei nicht gleichzeitig im Lese-Schreib-Modus öffnen kann?

Nein, Sie können das tun, aber die Frage ist, ob Sie es können erstellen eine Datei auf diese Weise.

Im Allgemeinen müssen Sie das hinzufügen trunc flag (ironisch eine der Möglichkeiten, wie man mit einer bestehenden Datei umgeht), oder entfernen Sie die in Flagge (siehe Hier).

Ja, das ist ein bisschen mühsam, aber es kommt von der Funktionsweise der ursprünglichen POSIX-APIs. Beschuldige sie!

Wenn Sie zuerst eine leere Datei erstellen und dann den obigen Code ausführen, ist fs.fail () immer false. Was ist der Grund für ein solches Verhalten der fstream-Klasse?

Sie können immer eine Datei öffnen, die existiert (gut, vorbehaltlich der Berechtigungen). Dieses Verhalten ergibt Sinn.


0 für die Antwort № 2

Der fs.fail () - Check ist immer erfolgreich. Bedeutet es, dass ich eine Datei nicht gleichzeitig im Lese-Schreib-Modus öffnen kann?

Siehe @Lightness Races in Orbit "s Antwort für eine bessere Erklärung.

Wenn Sie zuerst eine leere Datei erstellen und dann den obigen Code ausführen, ist fs.fail () immer false. Was ist der Grund für ein solches Verhalten der fstream-Klasse?

Wenn Sie auf die Konstruktordefinition von fstream Sie können sehen, dass mode definiert die Art, wie Sie es öffnen. Es hat andere Optionen wie app an eine vorhandene Datei anhängen. Wenn Sie eine Datei mit dem folgenden Code öffnen:

fstream fs(filePath, ios::in | ios::out | ios::binary);

Sie sagen, erstellen Sie eine neue Datei, wenn es nicht existiert. Was scheitert, wenn Sie es vor erstellt haben. Sie sollten die hinzufügen app, ate oder truncWenn Sie möchten, dass es erfolgreich geöffnet wird. Dies hängt davon ab, was genau Sie tun möchten. Beachten Sie jedoch, dass zwischen den Schritten des Erstellens und anschließenden Öffnens nicht garantiert werden kann, dass die Datei immer noch da ist. Sie sollten versuchen, dies auf einen Schlag zu tun und die Ausnahmebehandlung ihre Arbeit machen zu lassen, da Sie nie durchgehen können Fehler sowieso.