【发布时间】:2010-03-02 14:02:06
【问题描述】:
几天前我正在玩 istream 迭代器和异常处理,我遇到了这种好奇:
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{
if (argc < 2) {
cout << argv[0] << " <file>" << endl;
return -1;
}
try {
ifstream ifs(argv[1]);
ifs.exceptions(ios::failbit | ios::badbit);
istream_iterator<string> iss(ifs), iss_end;
copy(iss, iss_end, ostream_iterator<string>(cout, "\n"));
}
catch (const ios_base::failure& e) {
cerr << e.what() << endl;
return -2;
}
return 0;
}
为什么在读取输入文件的最后一个单词后总是引发故障位异常?
【问题讨论】:
-
有人可以修复格式吗?
-
当我在 C++ 中编程时,我从未使用迭代器读取文件,但在标准读取周期中,我有文件结束的特殊条件(即读取而不是 EOF)
-
@Roman:那你做错了。当出现读取错误时,仅测试 EOF 会导致无限循环,因为永远不会到达文件的末尾。最佳做法是始终测试 both 的 EOF 和失败。另一方面,OP 的代码使用异常,因此它是安全的。
-
@Konrad Rudolph:我只将 c++ 用于 ACM 竞赛,其中输入数据格式是严格预定义的。
-
@Roman:在大多数情况下,数据格式都是严格定义的。这不会改变你做错的事实。
标签: c++ exception iterator istream