2013-06-11 2 views
7

Ich habe, wahrscheinlich triviale Frage, aber ich kann es nicht verstehen. Ich habe schrieb den einfachen Code:VS8 kann nicht mit file.close(); file.open(); warum?

fstream file; 
file.open("data", ios::in); 
if(!file.good()){ 
    file.close(); 
    file.open("data", ios::out); 
    if(!file.good()) cout<<"not good"<<endl; 
    file<<"test"<<endl; 
    file.close(); 
} 

in frischem VS8 C++ Express-Projekt. Wenn ich es ausführe und "Daten" nicht existieren, erzeugt es eine Datei, gibt aber auch "nicht gut" (die zweite) zurück, so dass die Ausgabe nicht in die Datei geschrieben wird. Und jetzt kommt die lustige Sache. Wenn ich denselben Code in VS10 C++ Express und Code :: Blocks 12 kompiliere, funktioniert es gut.

Warum ist es so?

@edit Mein Freund überprüft es auf seinem PC mit VS8 C++ Expres auch. Funktioniert für ihn gleich.

@ edit2 Gleiche wie mein Kommentar mit "Lösung":

Erzwingen löschen failbit mit .clear(); Methode scheint zu funktionieren. Es tut weh , wenn Sie in neueren IDE lernen und dann zu älterem wechseln müssen: /. Tho, es gibt eine schöne Lektion. Danke Leute.

+2

Verschiedene Compiler haben manchmal unterschiedliche Implementierungen des Standards. Vor allem Microsoft Compiler ... – Appleshell

+0

Sie können 'is_open' anstelle von' good' verwenden. –

+1

Vielleicht wird das Failbit nach dem ersten Fehler nicht gelöscht. Es sieht so aus, als ob "open" jetzt das Failbit bei Erfolg in C++ 11 löscht und vielleicht wurde diese Änderung in VS2010 in Erwartung einiger der neuen Standardfunktionen gemacht (klicken Sie auf die Registerkarten, die Unterschiede zwischen C++ 03 und C + zeigen +11 http://www.cplusplus.com/reference/fstream/fstream/open/) – statueuphemism

Antwort

4

Dies war von Entwurf. In C++ 98 löscht das Schließen eines fstream den Fehlerstatus nicht und das Aufrufen von open() auf einem fstream setzt den Fehlerstatus nicht zurück. Eine Erörterung des Problems finden Sie unter LWG Defect #409.

Das Verhalten wurde in C++ 11 geändert, so dass der Fehlerstatus gelöscht wird (über einen Aufruf an clear()), wenn der offene Vorgang erfolgreich ist.

+0

Gibt es irgendwo, dass Microsoft diese Informationen teilt, abgesehen von seinen Entwicklern, die zufällig StackOverflow-Fragen durchgehen? Ich habe versucht, diese Information kurz über das Verhalten von fstream :: open in VS2010 relativ zu VS2008 zu suchen, konnte aber nichts schnell finden. – statueuphemism

+0

@stateuphemism: Die Dokumentation auf MSDN ist die maßgebliche Dokumentation für die Implementierung. Die Website [cppreference.com] (http://en.cppreference.com/w/) ist ebenfalls sehr gut (für die C++ - Standardbibliothek ist es unsere Absicht, die Bibliotheken wie angegeben zu implementieren; wir nehmen die Konformität sehr ernst). –

+0

Hier ist der MSDN-Artikel für VStream in VS2010 (zurückverfolgt zu basic_fstream :: open), die das Verhalten nicht erwähnt, das Sie als ein Update für C++ 0x beschreiben (nur Entwürfe von C++ 11 waren für verfügbar) VS2010-Version): http://msdn.microsoft.com/en-us/library/4dx08bh4(v=vs.100).aspx Als Entwickler, der möglicherweise zu einer späteren Version von Visual Studio migrieren möchte, veröffentlichen Sie Anmerkungen zu Dokumentieren Sie diese Änderungen sehr hilfreich, um subtile Fehler aufgrund undokumentierter Verhaltensänderungen zu verhindern. Ich habe auch http://msdn.microsoft.com/en-us/library/dd465215(v=vs.100).aspx durchsucht – statueuphemism

Verwandte Themen