2015-04-23 152 views
0

我想讀取幾個整數,直到命中eof(ctrl + d),然後讀取其他一些整數,但cin不再工作。輸入EOF後,不能重複使用cin讀取值

#include <iostream> 
using namespace std; 
int main() 
{ 
    int c; 
    while(cin >> c) 
     cout << c << endl; 
    int b; 
    cin.clear(); 
    cin.ignore(); 
    cin >> b; 
    cout<< "bla" << b << "ss" << endl; 
} 

輸出(輸入 「2」 後,我按ctrl + d)

:! ./test 
1 
1 
2 
2 
bla32767ss 

如何解決這一問題?

+0

[連續cin的問題]的可能重複(http://stackoverflow.com/questions/5146344/problem-with-consecutive-cins) – jsantander

+1

什麼是'.ignore()'? –

+0

不用理睬,它是相同的輸出... –

回答

1

Ctrl-D使標準輸入報告EOF但保持打開文件。您可以EOF後重用std::cin,如下面的簡單程序演示:

#include <iostream> 
#include <string> 

int main() 
{ 
    for (;;) 
    { 
     for (std::string s; std::cin >> s;) 
     { 
      std::cout << "Got token: " << s << "\n"; 
     } 
     std::cin.clear(); 
     std::cout << "Received EOF\n"; 
    } 
} 

現在,解析整數的時候,有一個解析錯誤的可能性。在這種情況下,流不是EOF,而是處於「失敗」狀態。您還需要清除該錯誤,但還需要丟棄不可解析的值。爲此你需要ignore

#include <iostream> 
#include <limits> 

int main() 
{ 
    for (;;) 
    { 
     for (int n; std::cin >> n;) 
     { 
      std::cout << "Got integer: " << n << "\n"; 
     } 
     if (std::cin.eof()) 
     { 
      std::cout << "Received EOF\n"; 
      std::cin.clear(); 
     } 
     else 
     { 
      std::cout << "Parsing failure\n"; 
      std::cin.clear(); 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
    } 
} 

您在使用ignore錯誤是雙重的:你只能忽略一個字符,即使輸入可以想見,由一個以上的無法解析的性格,而你忽略高達EOF,而不是直到下一個換行符:這是因爲ignore()具有默認參數,並且ignore()ignore(1, EOF)相同。

+0

但在這種情況下,cin.clear()不能與EOF一起工作。它可以處理其他無效輸入 –

+0

@KevinLing:已添加。 –