【发布时间】:2014-08-08 23:11:35
【问题描述】:
我的问题与a previous one 非常相似。我想打开并读取一个文件。如果无法打开文件,我希望抛出异常,但我不希望在 EOF 上抛出异常。 fstreams 似乎可以让您独立控制是否在 EOF、失败和其他不良事件上引发异常,但似乎 EOF 也倾向于映射到错误和/或失败异常。
这是我尝试做的一个精简示例。如果文件包含某个单词,函数 f() 应该返回 true,如果不包含,则返回 false,如果(比如说)文件不存在,则抛出异常。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool f(const char *file)
{
ifstream ifs;
string word;
ifs.exceptions(ifstream::failbit | ifstream::badbit);
ifs.open(file);
while(ifs >> word) {
if(word == "foo") return true;
}
return false;
}
int main(int argc, char **argv)
{
try {
bool r = f(argv[1]);
cout << "f returned " << r << endl;
} catch(...) {
cerr << "exception" << endl;
}
}
但它不起作用,因为使用 operator>> 的基本 fstream 读取显然是 EOF 设置坏或失败位的操作之一。如果文件存在且不包含“foo”,则该函数不会根据需要返回 false,而是抛出异常。
【问题讨论】: