gpt4 book ai didi

c++ - 使用 getline() 而不设置 failbit

转载 作者:可可西里 更新时间:2023-11-01 17:42:28 33 4
gpt4 key购买 nike

是否可以使用 getline() 读取有效文件而不设置 failbit?我想使用 failbit 以便在输入文件不可读时生成异常。

以下代码总是在最后一行输出 basic_ios::clear - 即使指定了有效输入也是如此。

测试.cc:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{
ifstream inf;
string line;

inf.exceptions(ifstream::failbit);
try {
inf.open(argv[1]);
while(getline(inf,line))
cout << line << endl;
inf.close();
} catch(ifstream::failure e) {
cout << e.what() << endl;
}
}

输入.txt:

the first line
the second line
the last line

结果:

$ ./a.out input.txt 
the first line
the second line
the last line
basic_ios::clear

最佳答案

你不能。该标准对 getline 说:

If the function extracts no characters, it calls is.setstate(ios_base::failbit) which may throw ios_base::failure (27.5.5.4).

如果您的文件以空行结尾,即最后一个字符是“\n”,那么最后一次调用 getline 将读取任何字符并失败。实际上,如果不设置故障位,您希望循环如何终止? while 的条件将始终为真,并且将永远运行。

我认为您误解了 failbit 的含义。它 表示无法读取该文件。它被用作最后一次操作成功的标志。为了指示低级故障,使用了 badbit,但它对标准文件流几乎没有用处。 failbit 和 eofbit 通常不应被解释为异常情况。另一方面 badbit 应该,我认为 fstream::open 应该设置 badbit 而不是 failbit。

无论如何,上面的代码应该写成:

try {
ifstream inf(argv[1]);
if(!inf) throw SomeError("Cannot open file", argv[1]);
string line;
while(getline(inf,line))
cout << line << endl;
inf.close();
} catch(const std::exception& e) {
cout << e.what() << endl;
}

关于c++ - 使用 getline() 而不设置 failbit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855226/

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