每當我在這裏提出一個問題時,結果都是一些非常愚蠢的錯誤(如果你不相信我,請查看我的歷史記錄),所以請耐心等待可以在這裏。C++ istream操作符>>錯誤數據處理
感覺好像我的問題應該很受歡迎,但是我找不到任何關於它的事情,我已經用盡了想法嘗試。
無論如何,事不宜遲:
我試着輸入超載operator>>
。它應該在同一時間從文件中讀取一個整數,跳過無效數據如char
S,float
S等
當然,我檢查if(in >> inNum)
既的get()的下一個標記和檢查成功get()。
如果成功,那裏就不多說了。
如果它失敗了,但是,我認爲一兩件事情發生了:
- 它偶然發現了一個非整數
- 它到達EOF
以下是我試圖解決它:
istream& operator>> (istream& in, SortSetArray& setB) {
bool eof = false;
int inNum = -1;
while(!eof) {
if(in >> inNum) {
cout << "DEBUG SUCCESS: inNum = " << inNum << endl;
setB.insert(inNum);
}
else {
// check eof, using peek()
// 1. clear all flags since peek() returns eof regardless of what
// flag is raised, even if it's not `eof`
in.clear();
cout << "DEBUG FAIL: inNum = " << inNum << endl;
// 2. then check eof with peek()
eof = (in.peek() == std::char_traits<char>::eof());
}
}
return in;
}
該文件包含[1 2 3 4 a 5 6 7],程序自然進入無限循環。 好吧,很容易猜到,peek()不消耗字符'a',也許in >> inNum
也未能以某種方式消耗它。沒什麼大不了的,我只會嘗試一下。
這就是我在過去的2個小時裏所呆過的地方。我嘗試了istream :: ignore(),istream :: get(),ios :: rdstate來檢查文件中的eof,double
和string
而不是char
,以防char
被數字讀取。
沒有用,我很絕望。
古怪足夠,該方法上述工作了以前的方案,我必須讀出的數據的條目的三重行上的格式的:string
int
int
唯一的區別是我使用的ifstream
對象爲那一個,和這個的一個istream
對象。
紅利問題:當打嗝發生時,inNum的值爲0。我猜這是istream :: operator >>所做的事情?
使用'in.clear();'清除任何錯誤標誌導致它再次嘗試編輯:還加上'CIN。忽略(STD :: numeric_limi ts :: max(),'\ n');'刪除被卡在流中的字符 –
Gasim
@Gasim我不確定你的意思。這是我在else {}中做的第一件事情。我應該在哪裏清除()'? – Kafeaulait
對不起,閱讀編輯 – Gasim