2013-06-11 85 views
7

我有,可能微不足道的問題,但我無法理解它。 我已經寫了簡單的代碼:VS8無法處理file.close(); file.open(),爲什麼?

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

新鮮VS8 C++快車項目。當我運行它並且「數據」不存在時,它創建文件,但也返回「不好」(第二個),所以輸出不會寫入文件中。現在來了有趣的事情。如果我在VS10 C++ Express和Code :: Blocks 12中編譯相同的代碼,它工作正常。

這是爲什麼?

@edit 我的朋友在他的PC上用VS8 C++ Expres也檢查過它。爲他工作。

@ EDIT2同用 「解決方案」 我的評論:

強制清除failbit與.clear();方法似乎工作。當你在較新的IDE中學習並且必須切換到較舊的IDE時,它會傷害 :/。 Th,它給了很好的教訓。多謝你們。

+2

不同的編譯器有時會有不同的標準實現。尤其是微軟編譯器... – Appleshell

+0

你可以使用'is_open'而不是'good'。 –

+1

也許故障位在第一次故障後沒有被清除。看起來像「open」現在清除了C++ 11成功時的失敗位,也許這個變化是在VS2010中進行的,因爲它預見到了一些新的標準功能(點擊顯示C++ 03和C + +11 http://www.cplusplus.com/reference/fstream/fstream/open/) – statueuphemism

回答

4

這是設計。在C++ 98中,關閉fstream不會清除錯誤狀態,並且在fstream上調用open()不會重置錯誤狀態。有關此問題的討論,請參閱LWG Defect #409

C++ 11中的行爲已更改,如果打開操作成功,則會清除錯誤狀態(通過調用clear())。

+0

Microsoft有沒有通過其開發人員分享此信息的任何地方,這些開發人員恰好在閱讀StackOverflow問題?我試圖簡單地搜索這些信息,瞭解VS2008相對於VS2008的fstream :: open的行爲,但無法快速找到有價值的東西。 – statueuphemism

+0

@statueuphemism:MSDN上的文檔是實施的權威性文檔。 [cppreference.com](http://en.cppreference.com/w/)網站也非常好(對於C++標準庫,我們的意圖是按照指定實現這些庫;我們非常認真地遵守這些庫)。 –

+0

下面是在VS2010中打開的fstream的MSDN文章(追溯到basic_fstream :: open),它沒有提到您描述的符合C++ 0x的更新的行爲(只有C++ 11的草稿可用於VS2010的發佈):http://msdn.microsoft.com/en-us/library/4dx08bh4(v=vs.100).aspx作爲一個正在尋找潛在的遷移到Visual Studio的更高版本的開發人員,記錄這些更改對於防止由於未記錄的行爲更改而導致的細微錯誤非常有用。我還瀏覽了http://msdn.microsoft.com/en-us/library/dd465215(v=vs.100).aspx – statueuphemism

相關問題