2013-06-11 15 views
7

Mam, prawdopodobnie banalne pytanie, ale nie mogę tego zrozumieć. ja napisałem prosty kod:VS8 nie może obsłużyć file.close(); file.open() ;, dlaczego?

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(); 
} 

świeżym projektem VS8 w C++ Express. Kiedy go uruchomię, a "dane" nie istnieje, tworzy plik, ale zwraca także "niedobry" (drugi), więc dane wyjściowe nie są zapisywane w pliku. A teraz nadchodzi zabawna rzecz. Jeśli skompiluję ten sam kod w VS10 C++ Express i Code :: Blocks 12, to działa dobrze.

Dlaczego tak jest?

@edit Mój przyjaciel sprawdził to na swoim komputerze z VS8 C++ Expres też. Działa to samo dla niego.

@ Edit2 samo jak mój komentarz z "roztwór":

Zmuszanie wyczyścić failbit z .clear(); metoda wydaje się działać. To boli , gdy uczysz się w nowszym IDE, a następnie musisz przejść na starszy: /. Tho, daje mi to lekcję. Dzięki chłopaki.

+2

Różne kompilatory czasami mają różne implementacje standardu. Zwłaszcza kompilatory Microsoft ... – Appleshell

+0

Możesz użyć 'is_open' zamiast' good'. –

+1

Być może błąd nie został wyczyszczony po pierwszej awarii. Wygląda na to, że "open" usuwa teraz błąd po sukcesie w C++ 11 i być może ta zmiana została dokonana w VS2010 w oczekiwaniu na niektóre z nowych standardowych funkcji (kliknij na zakładki, które pokazują różnice między C++ 03 i C + +11 http://www.cplusplus.com/reference/fstream/fstream/open/) – statueuphemism

Odpowiedz

4

Było to zgodne z projektem. W C++ 98 zamykanie strumienia nie kasuje stanu błędu i wywoływanie w strumieniu nie kasuje stanu błędu. Aby porozmawiać o problemie, zobacz LWG Defect #409.

Zachowanie zostało zmienione w C++ 11 w taki sposób, że stan błędu został wyczyszczony (przez połączenie z clear()), jeśli operacja otwarta się powiedzie.

+0

Czy Microsoft udostępnia te informacje niezależnie od swoich programistów, którzy stosują pytania dotyczące StackOverflow? Próbowałem poszukać krótko tych informacji na temat zachowania fstream :: open w VS2010 w stosunku do VS2008, ale nie mogłem szybko znaleźć niczego wartościowego. – statueuphemism

+0

@ statueuphemism: Dokumentacja na MSDN jest autorytatywną dokumentacją do wdrożenia. Strona [cppreference.com] (http://en.cppreference.com/w/) jest również bardzo dobra (dla Standardowej Biblioteki C++ naszym zamiarem jest zaimplementowanie bibliotek w określony sposób, bardzo poważnie podchodzimy do zgodności). –

+0

Oto artykuł MSDN dla fstream open w VS2010 (odsyłający do basic_fstream :: open), który nie wspomina o zachowaniu, które opisujesz jako aktualizację zgodną z C++ 0x (tylko wersje robocze C++ 11 były dostępne dla Wydanie VS2010): http://msdn.microsoft.com/en-us/library/4dx08bh4(v=vs.100).aspx Jako programista, który chce potencjalnie przenieść się do późniejszej wersji Visual Studio, należy wydać udokumentowanie tych zmian byłoby bardzo pomocne w zapobieganiu drobnym błędom wynikającym z nieudokumentowanych zmian zachowań. Przeglądałem też http://msdn.microsoft.com/en-us/library/dd465215(v=vs.100).aspx – statueuphemism

Powiązane problemy