2013-01-18 62 views
6

比方說,我有一個具有檢查是否已成功地從STD讀取所有值:: istream的

100 text 

如果我嘗試閱讀使用ifstream的2號,它會失敗,因爲text不是一個數字的文件。使用的fscanf我就知道它通過檢查它的返回碼失敗:使用的,而不是標準輸入輸出的iostream時

if (2 != fscanf(f, "%d %d", &a, &b)) 
    printf("failed"); 

但是,我怎麼知道會失敗?

回答

11

它實際上是(如果不是更多)簡單:

ifstream ifs(filename); 
int a, b; 
if (!(ifs >> a >> b)) 
    cerr << "failed"; 

習慣了這種格式,順便說一句。因爲它在非常方便(甚至更多 - 所以繼續積極通過循環進展)。

3

如果一個人使用GCC與-std=c++11-std=c++14她可能會遇到:

error: cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ 

爲什麼? C++ 11標準bool運算符調用顯式(ref)。因此,有必要使用:

std::ifstream ifs(filename); 
int a, b; 
if (!std::static_cast<bool>(ifs >> a >> b)) 
    cerr << "failed"; 

我個人更喜歡使用以下功能fail的:

std::ifstream ifs(filename); 
int a, b; 
ifs >> a >> b 
if (ifs.fail()) 
    cerr << "failed"; 
相關問題