我有一个fstream指针fileP_
我打开一个文件:
fileP_.open(filePath_.c_str(), std::ios::in|std::ios::binary);
我有Read()
函数,其定义如下:
int Read(size_t offset, char *buffer, size_t *size)
所以我在@size
中从文件的偏移@buffer
开始阅读@offset
我的Read()
代码有点像这样:
int rc = 0
fileP_.seekg(offset);
fileP_.read(buffer, *size);
if (!fileP_.gcount()) {
if (fileP_.eof())
*size = rc;
else if (fileP_.fail())
rc = -EIO;
....
代码在offset < filesize
之前正常工作,但如果我给offset > filesize
gcount()
提供0
(这是预期的),但我得到-EIO
,而我期待offset > filesize
size = rc = 0
我在上面的代码中遗漏了什么吗?
谢谢!
答案 0 :(得分:0)
如果你寻求&gt; filesize操作失败,设置failbit并且读取不起作用...(eof尚未设置)
如果一个操作失败,则会激活failbit,并且在清除状态位之前,所有以下操作都将为no-op。在这种情况下,如果seekg失败,istream :: read将不会读取任何内容,特别是不会设置eofbit。
另一方面,当文件中的位置“结束”时,eofbit不会被激活。实际上,当流检测到文件结束时,即当它尝试获取下一个char并返回EOF时,它会被激活。
通常,在C ++中,使用eofbit控制输入结束并不是一个好主意。最好测试操作是否成功。当操作失败时,使用eofbit测试问题是否是文件结尾。