gpt4 book ai didi

c++ - 为什么在异常掩码未设置为 eofbit 时 getline() 抛出 'std::ios_base::failure'?

转载 作者:可可西里 更新时间:2023-11-01 17:51:53 27 4
gpt4 key购买 nike

考虑以下代码:

    ifstream in;
try {
in.exceptions ( ifstream::failbit | ifstream::badbit );
in.open(pConfLocation);
} catch ( ifstream::failure e ) {
throw std::runtime_error("Can't open configuration file\n");
}

vector<string> lns;
string s;

in.clear();
while ( !in.eof() ){
getline( in, s );
boost::algorithm::trim(s);
lns.push_back( s+='\n');
}

所以:

  1. 我根据 try-catch block 的需要设置了以下“异常掩码”(ifstream::failbit | ifstream::badbit)。文件打开没有问题。
  2. 在 while{} block 中,我知道将在文件末尾设置 eofbit。 But

The exception mask is an internal value of all stream objects specifying which state flags have to throw an exception when they are set.

我没有设置ifstream::eofbit,但无论如何在运行时出现以下错误:

terminate called after throwing an instance of 'std::ios_base::failure'
what(): basic_ios::clear
The program has unexpectedly finished.

我无法理解这种行为。我尝试在 while{} 之前使用 in.clear() 但没有效果。 clear() 本身设置 goodbit,据我所知,“标志必须抛出异常”(参见上面的引用),但是当 googbit 设置时它不会导致抛出任何异常......

如果删除

        in.exceptions ( ifstream::failbit | ifstream::badbit );

有效。


在这种情况下如何使 getline() 工作?

最佳答案

问题出在您的输入迭代中。 eofbit 仅在上一次读取到达 EOF 时设置,如果下一次读取将只读取 EOF,则不会设置。当后者发生时,failbit 同时被设置。查看讨论 here .

在您的特定情况下,如果文件以换行符结尾(很可能如此),getline() 会读取并包括该换行符并返回。 eofbit 仍未设置。下一个 getline() 然后直接遇到 EOF,并且根据其文档,“如果该函数未提取任何元素,它会调用 setstate(failbit)。”

关于c++ - 为什么在异常掩码未设置为 eofbit 时 getline() 抛出 'std::ios_base::failure'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13651054/

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