2010-03-02 29 views
1

我正試圖將一個vector載入流中並返回。 雖然第一部分沒有問題,但下面代碼的最後一行將std :: ios_base置爲錯誤狀態。你有什麼想法,爲什麼這樣? 顯然myVecOut等於myvec會在代碼執行後....無法解釋爲什麼std :: istream_iterator將std :: ios_base設置爲錯誤狀態

std::vector<double> myVec(3); 
    std::stringstream temp; 
    std::copy(myVec.begin(), myVec.end(), std::ostream_iterator<double>(temp, " ")); 
    std::cout << temp.str() << std::endl; 
    std::vector<double> myVecOut; 
    std::copy(std::istream_iterator<double>(temp), std::istream_iterator<double>(), std::back_inserter(myVecOut)); 
+0

我認爲這是因爲所有的標準。 – ChaosPandion 2010-03-02 17:27:07

+0

什麼是輸入數據? – 2010-03-02 17:33:33

+0

另請參閱:http://stackoverflow.com/questions/2363581/input-stream-iterators-and-exceptions – 2010-03-02 18:03:50

回答

3

它設置成fail狀態,因爲copy不知道有多少項目,閱讀。只要流的狀態爲 .good() .fail()狀態,它就會讀取。在跳過最後一個空格時,結束,並設置eof(因爲它試圖讀取超出結尾)和fail(因爲它無法讀取它想要的雙倍)。

之後致電.clear()清除這些錯誤位。


比較不相等而.good()是真實的,而.fail()是假是istream_iterator仍然會提前即使流處於eof狀態的迭代之間的差異。下面進一步檢查它:

std::stringstream a; 
a << "1.1 2.2"; 
std::copy(std::istream_iterator<double>(a), std::istream_iterator<double>(), 
      std::ostream_iterator<double>(std::cout, " ")); 

現在,當我們閱讀「2.2」時,eof的狀態下(因爲它試圖讀取超出「2」)。但是開始和結束迭代器不會進行比較,因爲fail狀態未設置,因此.fail()不會返回true(而.good()將返回false,因爲它還會考慮.eof())。只有在下一次讀取之後,當它不能再讀取另一個double時,纔會設置fail狀態,並且,然後迭代器會比較相等,並退出std::copy中的循環。

相關問題