作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题Re: [请益] iostream 的 good() fail() bad()
时间Mon Jul 11 19:17:03 2005
※ 引述《renderer (rendering)》之铭言:
: 请问 iostream 里的 good(), fail(), bad() 三个 function 的确切意思
: 以及各用在什麽情况下
: 小弟看了线上的文件 实在读不太懂
good() 是正常状态,没发生什麽异常,就是 good()
fail() 是我们对 stream 的一些操作没有成功,像是
int i;
cin >> i;
结果却喂英文字母(如 a) (而不是数字)给它吃,於是 cin 就会
fail() 这时候就可以 cin.clear(); 让 cin 能够继续给我们使用。
这个 clear 不同於 STL container 的 clear, 而是指将 stream 的
iostate 重设为 good. 这时那个 a 还留在 cin buffer 内,要用 char
或字串把它吃进来消化掉。例如
int i;
cout << "Enter a number: "; // 故意打 a
cin >> i; // 因为输入资料格式错误所以 fail()
char ch;
cin.clear();
cin >> ch; // 若不先做 cin.clear() 将 failbit 清掉,
// 以使 fail() 为假,那就无法继续使用 cin
// 也无法将留在 buffer 中的 a 给消化掉
cout << ch; // 输出 a
bad() 是严重的 stream 内部错误,一旦发生,那这个 stream
就烂掉了(corrupted),不能再使用了。即使用 clear() 故意将
iostate 设为 goodbit 也徒劳。
再举一些例子,假如一个档案有三行资料
/* input.txt
first
second
third
*/
ifstream ifs("input.txt");
string str;
while (getline(ifs, str)) { // 测试的条件是 ifs 是否 !fail()
cout << str << '\n';
if (ifs.good()) cerr << "ifs good\n";
}
// 回圈跑三次,每次都会显示 ifs good
// 离开回圈,是因为第四次读到 eof 所以 eof() 为真,而且因为要读
// 而没得读,fail() 也为真
if (ifs.good()) cerr << "ifs good\n"; // 不会印
if (ifs.fail()) cerr << "ifs fail\n"; // 会印
if (ifs.eof()) cerr << "ifs eof\n"; // 会印
if (ifs.bad()) cerr << "ifs bad\n"; // 不会印. stream 并未烂掉
那有没有什麽操作会导致 eof() 为真,但是 fail() 为假呢?
有的。像是
ifstream ifs("input.txt");
string str;
getline(ifs, str, 'x'); 故意用测资中没的字母 x 来当 delimiter 符号
cout << str; // 完整印出三行测资
if (ifs.good()) cerr << "ifs good\n"; // 不会印
if (ifs.fail()) cerr << "ifs fail\n"; // 不会印!!
if (ifs.eof()) cerr << "ifs eof\n"; // 会印
if (ifs.bad()) cerr << "ifs bad\n"; // 不会印. stream 并未烂掉
从以上也可看出,fail, eof, bad 的状态都会导致 good() 为假。
而 bad() 也不能理解为 good() 的相反。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.168
1F:推 renderer:khoguan 大出现啦 感谢再感谢 ^^ 61.228.217.9 07/11
2F:→ khoguan:不客气^^好几天没上B了.看到热心的r兄问题没人回220.130.208.168 07/11
3F:推 renderer:khoguan 大 何时出来竞选版主席呀 61.228.217.9 07/11
4F:推 aecho: khoguan 大 何时出来竞选版主席呀218.167.216.170 07/11
5F:推 UNARYvvv:推 详细的解说! 61.59.30.19 07/11