【发布时间】:2023-03-10 01:13:02
【问题描述】:
我听说<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) 字节?
【问题讨论】: