2014-11-05 97 views
1

我有循環收集輸入,第一收集輸入雙打的矢量...使用連續CIN >>輸入迴路

double input; 
while (cin >> input) 
{ 
    list.push_back(input); 
} 

和第二收集輸入INTS的矢量...

int input; 
while (cin >> input) 
{ 
    list.push_back(input); 
} 

第二個循環保持自動退出,所以我增加了以下兩行...

cin.clear(); 
cin.ignore(INT_MAX,'\n'); // I've also tried cin.ignore() 

然而此HA發生在我的輸出中的數據在第二個循環中被丟棄。我怎樣才能讓他們以他們需要的方式工作?

+0

你怎麼樣逃避要麼循環? – 2c2c 2014-11-05 05:24:48

+0

不知道是否是好的做法,但我有他們鍵入退出,所以輸入將是5.6 7.3 9.4退出 – codingManiac 2014-11-05 05:30:50

回答

2

第一個循環讀取,直到流變壞,因爲沒有任何double讀取。當流變壞時,除非您執行某些操作,例如使用std::cin.clear()來清除狀態標誌,否則它不會再變好。

當然,只是清除狀態標誌不會有太大的區別,因爲它會讀取所有可行的數字:有效的double s的格式是有效的int s格式的超集(好吧,除非他們正在使用base 16)。也就是說,您需要某種分隔符,可能是非空格的非數字字符。您使用ignore()應跳過分隔符並跳轉到下一個換行符(儘管魔術值不是INT_MAX,而是std::numeric_limits<std::streamsize>::max())。

目前還不清楚你試圖輸入,但如果你使用類似

1 2 3 exit 4 5 6 

前三值將被讀取爲double和其他一切都將被忽略。也就是說,你可能希望忽略字符有點更加謹慎,例如,清除輸入和不斷嘗試讀取intclear()ignore()直到成功:

// skip separator: 
std::cin.clear(); 
int input; 
while (!(std::cin >> input)) { 
    std::cin.clear(); 
    std::cin.ignore(); // ignore the next character only 
} 
do { 
    list.push_back(input); 
} while (std::cin >> input);