gpt4 book ai didi

c++ - 为什么在读取时发现 eof 时会设置故障位?

转载 作者:IT老高 更新时间:2023-10-28 21:51:48 26 4
gpt4 key购买 nike

我读过 <fstream>早于 <exception> .忽略 fstream 上的异常这一事实信息量不大,我有以下问题:

可以使用 exceptions() 对文件流启用异常。方法。

ifstream stream;
stream.exceptions(ifstream::failbit | ifstream::badbit);
stream.open(filename.c_str(), ios::binary);

任何尝试打开不存在的文件、没有正确权限的文件或任何其他 I/O 问题都将导致异常。使用自信的编程风格非常好。该文件应该在那里并且是可读的。如果条件不满足,我们会得到一个异常。如果我不确定文件是否可以安全打开,我可以使用其他函数来测试它。

但现在假设我尝试读入缓冲区,如下所示:

char buffer[10];
stream.read(buffer, sizeof(buffer));

如果流在填充缓冲区之前检测到文件结尾,则流决定设置 failbit ,如果它们被启用,则会引发异常。为什么?这有什么意义?我本可以验证只是测试 eof()看完后:

char buffer[10];
stream.read(buffer, sizeof(buffer));
if (stream.eof()) // or stream.gcount() != sizeof(buffer)
// handle eof myself

这种设计选择阻止我在流上使用标准异常,并迫使我创建自己的权限或 I/O 错误异常处理。还是我错过了什么?有什么出路吗?例如,我是否可以轻松测试我是否可以阅读 sizeof(buffer)在这样做之前要在流中保存字节数?

最佳答案

failbit 旨在允许流报告某些操作未能成功完成。这包括诸如无法打开文件、尝试读取不存在的数据以及尝试读取错误类型的数据等错误。

您所询问的具体案例在此转载:

char buffer[10];
stream.read(buffer, sizeof(buffer));

您的问题是为什么在读取所有输入之前到达文件结尾时设置了失败位。原因是这意味着读取操作失败 - 您要求读取 10 个字符,但文件中没有足够多的字符。因此,操作没有成功完成,并且流信号 failbit 让您知道这一点,即使将读取可用字符。

如果你想进行读取操作,最多个字符,你可以使用 readsome 成员函数:

char buffer[10];
streamsize numRead = stream.readsome(buffer, sizeof(buffer));

此函数将读取字符直到文件末尾,但与 read 不同,如果在读取字符之前到达文件末尾,它不会设置故障位。换句话说,它说“试着读这么多字符,但如果你不能读也不是错误。让我知道你读了多少。”这与 read 形成鲜明对比,后者说“我想要精确这么多字符,如果你做不到,那就是错误。”

编辑:我忘记提到的一个重要细节是可以设置 eofbit 而不触发 failbit。例如,假设我有一个包含文本的文本文件

137

之后没有任何换行符或尾随空格。如果我写这段代码:

ifstream input("myfile.txt");

int value;
input >> value;

那么此时 input.eof() 将返回 true,因为从文件中读取字符时,流会到达文件末尾,试图查看文件中是否还有其他字符溪流。但是,input.fail()返回 true,因为操作成功了——我们确实可以从文件中读取一个整数。

希望这会有所帮助!

关于c++ - 为什么在读取时发现 eof 时会设置故障位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781545/

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