2013-11-01 63 views

回答

0

的一般模式是檢查輸入操作的結果:

double d; 
if (file >> d) { vec[i] = d; } 
else   { /* error (now you must handle this before trying again) */ } 

如果出現錯誤,你必須對一些政策的下一步該怎麼做決定 - 跳過它以某種方式,終止程序等

+0

這不會修復像'2,4334nnngadfj4'這樣的輸入。它只是使用'2'。 – user2946291

+0

@ user2946291:是的,但您會在下一輪看到。或者,如果你使用linewise串流,你可以添加'>> std :: ws',然後檢查沒有其他東西。 –

0

通常情況下,你可以只檢查失敗位的讀取後:

cin>>d; 
if(cin.fail()) 
    // we failed! Print an error! 

或者是這樣的:

if (not (cin>>d)) 
    // we failed! Print an error! 

但是,如果您有很多讀取操作,那麼您可能會很煩惱,因爲每次讀取後都會處理錯誤。

或者,您可以打開在cin拋出異常失敗的選項:

cin.exception(std::ios::failbit); 
//... 
cin>>d; // will throw on failure 
0

我怎麼能相信,這將返回一個錯誤信息,如果它試圖讀取該行不是一個數字?

一種常見的技術是在輸入完成後將流位設置爲異常掩碼。然後,您可以按照自己的喜好執行清理(或重新拋出異常):

file.exceptions(std::ios_base::goodbit); 

while (file >> x) 
{ 
    // ... 
} 

try { file.exceptions(std::ios_base::badbit | 
         std::ios_base::failbit | std::ios_base::eofbit); } 
catch(std::ios_base::failure&) 
{ 
    if (file.rdstate() & std::ios_base::failbit) 
     // ... 
    if (file.rdstate() & std::ios_base::badbit) 
     // ... 
    if (file.rdstate() & std::ios_base::eofbit) 
     // ... 
}