2010-11-12 71 views
3

我正在閱讀C++編程語言手冊,並且介紹了「Iterators和I/O」第61頁,他們給出以下示例來演示迭代通過提交的字符串。使用istream_iterator對int和字符串進行迭代

#include <iostream> 
#include <iterator> 
#include <string> 

using namespace std; 

int main() 
{ 

    istream_iterator<string>ii(cin); 
    istream_iterator<string>eos; 

    string s1 = *ii; 
    ++ii; 
    string s2 = *ii; 

    cout <<s1 << ' '<< s2 <<'\n'; 
} 

我完全理解,現在我用這個例子玩弄,使其成爲數字正常工作。我試着在相應的地方添加以下內容...

istream_iterator<int>jj(cin); 
int i1 = *jj; 
cout <<s1 << ''<< s2 << ''<< i1 <<'\n'; 

這不會讓我有機會在運行程序時輸入數字部分。這是爲什麼?迭代器只能在cin上使用一次嗎?這樣它已經有來自cin的輸入,所以下一個迭代器會被忽略?這裏


編輯是我插入後

#include <iostream> 
#include <iterator> 
#include <string> 

using namespace std; 

int main() 
{ 

    istream_iterator<string>ii(cin); 
    istream_iterator<string>eos; 

    //istream_iterator<int>dd(cin); 

    string s1 = *ii; 
    ++ii; 
    string s2 = *ii; 
    //int d = *dd; 
    int d =24; 
    cout <<s1 << ' '<<s2<<' '<<d<< '\n'; 
} 

你好上述作品世界
你好
世界

給予的Hello World作爲該輸出。

istream_iterator<int>dd(cin); 
int d = *dd; 

去除意見和註釋掉

int d =24; 

信息你好你好0作爲輸出。

+0

你的第二個代碼片段不清;第二個陳述後i1的價值是什麼? – 2010-11-12 00:47:02

+0

@evan現在修好了。 – phwd 2010-11-12 00:49:53

+0

你的完整代碼是什麼樣的?你得到什麼輸出?你期待什麼輸出? – 2010-11-12 00:52:51

回答

6

當您首次創建istream_iterator時,它會獲取第一個輸入並在內部存儲數據。爲了獲得更多的數據,你可以調用operator ++。因此,這裏是正在發生的事情在你的代碼:

int main() 
{ 

    istream_iterator<string>ii(cin); // gets the first string "Hello" 
    istream_iterator<int>jj(cin); // tries to get an int, but fails and puts cin in an error state 

    string s1 = *ii; // stores "Hello" in s1 
    ++ii;   // Tries to get the next string, but can't because cin is in an error state 
    string s2 = *ii; // stores "Hello" in s2 
    int i1 = *jj; // since the previous attempt to get an int failed, this gets the default value, which is 0 

    cout <<s1 << ' '<<s2 <<' '<< i1 << '\n'; 
} 

這裏是你想要做什麼:

int main() 
{ 

    istream_iterator<string>ii(cin); 

    string s1 = *ii; 
    ++ii; 
    string s2 = *ii; 

    istream_iterator<int>jj(cin); 
    int i1 = *jj; 

    // after this, you can use the iterators alternatingly, 
    // calling operator++ to get the next input each time 

    cout <<s1 << ' '<<s2 <<' '<< i1 << '\n'; 
} 
+0

請注意,此答案基於該帖子的修訂版本3。 – 2010-11-12 01:13:54

+0

啊好吧我想我現在得到它,所以cin錯誤會影響獲取更多數據?有沒有辦法查看錯誤是否發生?像我可以聆聽的錯誤標誌? – phwd 2010-11-12 01:14:58

+0

@phwd:cin.fail()或!cin – 2010-11-12 01:16:56

相關問題