我想在我這樣的小程式中處理輸入驗證。
我有一個包含由空格分隔的整數值的檔案。但有時會有無效值,例如字母或任何其他非數字字符。所以,我想忽略那些無效值,只推送整數向量中的有效整數。
這是我到目前為止嘗試過的:
ifstream in("values");
if(!in)
throw runtime_error("File \'values\' was not properly opened!");
vector<int> v;
int x = 0;
while( !(in >> x).eof() ){
if( !in.fail() )
v.push_back(x);
else{
cout << "Invalid input\n";
in.clear();
in.ignore(numeric_limits<streamsize>::max(), '\n');
}
}
for(int val : v)
cout << val << ", ";
輸入檔案values包含以下內容:
5 7 23 16 81 v 1474 119 21 29 5 88*
輸出:
Invalid input
5, 7, 23, 16, 81,
為什么v會導致閱讀停止?為什么清除流并沒有讓它回到有效狀態,以便它可以讀取剩余的有效值?
對我來說很重要的是:如果我std::cin在同一個程式中使用具有相同輸入值的輸入流,我會正確地得到它,并且如我所料:
輸入:
5
7
23
16
81
v
Invalid input
1474
119
21
29
5
88*
Invalid input
Ctrl D (eof)
輸出:
5, 7, 23, 16, 81, 1474, 119, 21, 29, 5, 88,
uj5u.com熱心網友回復:
您的輸入檔案在 1 行上包含所有內容,那么您認為v遇到然后in.ignore()被呼叫以忽略直到下一個'\n'(換行符)的所有內容時會發生什么?沒錯,它會忽略檔案的其余部分!
使用 時cin,您的輸入值位于單獨的行上,因此呼叫ignore()with'\n'將僅忽略當前行的其余部分,使后續行可供讀取。
要解決您的問題,請在呼叫檔案流時嘗試使用' '(space) 而不是'\n'(line break) :ignore()
in.ignore(numeric_limits<streamsize>::max(), ' ');
在線演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/514501.html
標籤:C 验证文件-io
