即使偏移超出文件大小,{e 44位也未设置

时间:2016-07-20 09:08:34

标签: c++ fstream eof

我有一个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 我在上面的代码中遗漏了什么吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

如果你寻求&gt; filesize操作失败,设置failbit并且读取不起作用...(eof尚未设置)

如果一个操作失败,则会激活failbit,并且在清除状态位之前,所有以下操作都将为no-op。在这种情况下,如果seekg失败,istream :: read将不会读取任何内容,特别是不会设置eofbit。

另一方面,当文件中的位置“结束”时,eofbit不会被激活。实际上,当流检测到文件结束时,即当它尝试获取下一个char并返回EOF时,它会被激活。

通常,在C ++中,使用eofbit控制输入结束并不是一个好主意。最好测试操作是否成功。当操作失败时,使用eofbit测试问题是否是文件结尾。