2014-10-02 65 views
-1

我試圖從包含整數T和其後的T個句子的文件中獲取輸入。cin.ignore(INT_MAX)正在清除所有內容

#include<iostream> 
#include<string> 
#include<vector> 
#include<iterator> 
#include<sstream> 
#include<algorithm> 
#include<limits.h> 
#include<stdlib.h> 
#include<stdio.h> 

using namespace std; 

int main() { 
    int T; 
    cin >> T; 
    int m = 0; 
    cin.ignore(INT_MAX); 
    while(m < T) { 
     string sentence; 
     getline(cin,sentence,'\n'); 
     cout << "Case #" << m << ": " << sentence << endl; 

     m++; 
    } 
} 

在給出5個字符串的輸入時,我得到以下輸出。

Case #0: 
Case #1: 
Case #2: 
Case #3: 
Case #4:  

這是文件數據

5 
this is a test 
foobar 
all your base 
class 
pony along 
+3

你可以發佈這樣的文件的例子嗎?無論如何,忽略INT_MAX將丟棄標準輸入中的大量字符,我相信這不是你想要的 – 2014-10-02 11:22:51

+0

@MarcoA。我已經添加了文件的內容。 – user3747190 2014-10-02 12:25:44

回答

1

什麼是你期待發生什麼?

你告訴輸入流中跳過數十億的字符,直到達到最終的文件,先發生者爲準:

cin.ignore(INT_MAX); 

然後嘗試再次從流中讀取:

getline(cin,sentence,'\n'); 

由於它位於EOF而失敗,但不檢查讀取操作是否成功。

再經過每一次失敗的閱讀您打印並沒有改變,因爲讀取失敗的空字符串:

cout << "Case #" << m << ": " << sentence << endl; 

然後你重複嘗試讀取行了好幾次。

而不是隻是要求StackOverflow來修復你的程序,你爲什麼不嘗試修改它來找出哪裏出了問題?

例如

if (getline(cin,sentence,'\n')) 
    cout << "Case #" << m << ": " << sentence << endl; 
else 
    throw std::runtime_error("getline failed"); 

學習在你的代碼隔離問題並找出其行爲不端的是,你永遠不會寫整個程序,然後轉向StackOverflow的時候它不工作學習的一項重要技能。

+0

感謝您的建議。 – user3747190 2014-10-02 12:54:36