gpt4 book ai didi

c++ - fstream EOF 意外抛出异常

转载 作者:搜寻专家 更新时间:2023-10-31 01:03:48 28 4
gpt4 key购买 nike

我的问题与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;
}
}

但它不起作用,因为使用运算符>> 的基本 fstream 读取显然是 EOF 设置错误或失败位的操作之一。如果文件存在且不包含“foo”,则该函数不会按预期返回 false,而是抛出异常。

最佳答案

std::ios_base::failbit 标志也会在文件到达末尾时尝试提取时设置,这是流的 bool 运算符的行为所允许的。您应该在 f() 中设置一个额外的 try-catch block ,如果它不符合文件结束条件,则重新抛出异常:

std::ifstream ifs;
std::string word;

ifs.exceptions(std::ifstream::failbit | std::ifstream::badbit);

try {
ifs.open(file);
while (ifs >> word) {
if (word == "foo") return true;
}
}
catch (std::ios_base::failure&) {
if (!ifs.eof())
throw;
}
return false;

关于c++ - fstream EOF 意外抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25213540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com