2015-07-20 25 views
0

這本書,現在我讀暗示在read()函數返回istream&爲了能夠寫出這樣的事情返回的IStream和對象來檢查,如果條件

if (read(cin, some_container)) {...} 

然而,當我嘗試這個代碼我的功能無論如何總是返回假。哪裏有問題?

while (in >> c) 
    s.push_back(c); 
} 

該循環中斷時in處於狀態,使得if (in)將是錯誤的:

#include <iostream> 
#include <vector> 

using namespace std; 

istream& read(istream& in, vector<double>& s) 
{ 
    if (in) 
    { 
     in.clear(); 

    double c; 
    while (in >> c) 
     s.push_back(c); 
    } 

    return in; 
} 

int main() 
{ 
    vector<double> r; 
    if (read(cin, r)) 
     cout << "success" << endl; 
    else 
     cout << "false returned" << endl; 
    return 0; 
} 
+3

提示:您如何看待while循環結束? –

+0

我找到了你,儘快將「in」結束爲0.但是,爲什麼它終止?即使我輸入一個隨機單詞而不是雙重單詞,我仍然掉在循環中,但問題是爲什麼? – trollpidor

回答

0

std::iostream對象,如std::cincan be used in a bool context報告它們是否處於錯誤狀態

您的while循環結束一次in進入錯誤狀態,例如您嘗試讀取一個隨機詞作爲double

你的循環後,返回相同in對象,在if上下文中使用,並且作爲false再次評估,因爲,因爲它退出循環的狀態並沒有改變。

0

當你打破了下面的循環,你從函數返回。

您將需要一種不同的方式來測試read是否成功。例如

  1. 如果r有一個或多個值,則認爲read成功。
  2. 如果r有10個或更多值,則認爲read成功。