2012-09-27 18 views
6

在C++中,是否有這種情況,std::ifstream open()可以成功,但std::ifstream good()可能是假的?成功開放但不好?

編輯:用克測試++ 4.7.1

#include <iostream> 
#include <fstream> 
int main(int argc, char *argv[]) 
{ 
    std::ifstream filestream("testfile"); 
    std::cout<<filestream.good()<<std::endl; 
    std::cout<<filestream.eof()<<std::endl; 
    std::cout<<filestream.fail()<<std::endl; 
    std::cout<<filestream.bad()<<std::endl; 
    return 0; 
} 

將返回:1,0,0,0爲一個空文件,這意味着good = TRUEeof = fail = bad = FALSE。這是正常的嗎?

回答

3

標準驗證的實際文本之後,我不認爲eofbit允許的open後,設置:如果實際開拋出一個異常badbit可以設置(我認爲—標準並沒有真正說在這種情況下應該發生什麼);如果打開失敗,或者打開後尋找(如果設置ate)失敗,應設置爲failbit;但似乎沒有任何可以設置eofbit的情況。

在這種情況下並不是說調用std::istream::good()是一個很好的解決方案。 (知道OP試圖達到什麼會很有趣,無論如何,撥打std::istream::good()可能不是正確的解決方案。)

如果std::ifstream::good()返回false,則下一個輸入將失敗。 如果它返回true,它不會告訴你:下一個輸入可能成功, 但它也可能失敗。

+0

+1實現可能實際上不會測試文件,直到您嘗試讀取並且讀取失敗。 –

+0

@DavidRodríguez-dribeas通常,在輸入失敗之前測試'eofbit'是沒有意義的。事實上'std :: ifstream :: good()'測試'eofbit'(除了其他狀態位)使得它幾乎沒有價值。 –

+0

我不認爲使用「好」的提問者有任何*傷害*嗎?只是因爲'eofbit'沒有設置,所以你不妨像正常一樣測試流的真相。我認爲在做一些毫無意義的異常時,可讀性受到損害,並且像你說的那樣,「良好」的使用是毫無意義的異常...... –

2

如果文件爲空,eofbit將被觸發,但文件仍然會打開,所以是。

+0

我理解的方式獲取是eofbit是僅在操作嘗試讀取文件結尾時才設置。那是不正確的? – templatetypedef

+0

@templatetypedef我不確定。可以肯定的是,如果文件是空的,那麼實現並不需要設置'eofbit',但我不確定它不被允許。如果設置了「eofbit」,則意味着下一個輸入將失敗,因爲沒有數據。 (如果'eofbit'沒有設置,這並不意味着什麼。) –

+1

根據我對標準的讀數,這是不正確的。當底層文件緩衝區的open()成功時,文件流中的所有狀態位都會被清除。如果文件緩衝區「open()」失敗,則狀態設置爲'failbit'。無論哪種方式,在調用文件流「open()」之後'eofbit'都將清除。 –

1

ifstream::open返回void,因此要小心你說的「成功」的含義。

的標準說的basic_ifstream::open(27.9.1.9):

效果:調用rdbuf() - >打開(S,模式|的ios_base ::中)。如果該功能 不返回一個空指針調用清除(),否則調用 setstate這(failbit)(可能的ios_base拋出::失敗)

所以,如果對filebuf打開調用返回的值表示成功,則ifstream::open將清除所有錯誤位,因此good()必然返回true。

如果在filebuf上打開的調用返回一個表示失敗的值,那麼ifstream::open可以返回而不會引發異常。這種行爲可能與「成功」混淆,但在這種情況下good()由於設置了故障位而返回false。

這並不完全清楚,我爲什麼這樣設置failbit而非badbit,但我不認爲我缺乏理解報告中的事實:-)