当 seekg 查找文件末尾时未设置故障位 (C++,Linux)

failbit not being set when seekg seeks past end of file (C++,Linux)

本文关键字:故障 C++ Linux 设置 查找 seekg 文件      更新时间:2023-10-16

我看到了我认为是istream::seekg的奇怪行为。 具体来说,它似乎当我寻求明显偏离文件末尾的点时,不要设置故障位。

从我在文档中可以看出,应该设置故障位,但事实并非如此。

谁能解释这种行为? 相关代码片段:

class Tester 
{
  ... 
  void testTriggered()
  {
    fs.open("/pathtofile/testFile.TEST", std::ios_base::in|std::ios_base::binary);
    prv_testbits("testTriggered(): OpeningFile");
    fs.seekg(2000,std::ios_base::beg);
    prv_testbits("testTriggered(): seekTwoThousand");
    int g = fs.tellg();
    std::cout << "get pointer is:" << g << std::endl; 
  }
  void prv_testbits(std::string msg){
    if (fs.fail()) {
      std::cout << msg << ": failbit set." << std::endl;
    } else {
      std::cout << msg << ": failbit NOT set." << std::endl;
    }
    if (fs.bad()) {
      std::cout << msg << ": badbit set." << std::endl;
    }else {
      std::cout << msg << ": badbit NOT set." << std::endl;
    }
    if (fs.eof()) {
      std::cout << msg << ": eofbit set." << std::endl;
    } else {
      std::cout << msg << ": eofbit NOT set." << std::endl;
    }
  }
   ....
 private:
  std::ifstream fs;
}; 

输入文件由二十个字节组成: 0123456789abcdefghij

示例运行的输出:

testTriggered(): OpeningFile: failbit NOT set.
testTriggered(): OpeningFile: badbit NOT set.
testTriggered(): OpeningFile: eofbit NOT set.
testTriggered(): seekTwoThousand: failbit NOT set.
testTriggered(): seekTwoThousand: badbit NOT set.
testTriggered(): seekTwoThousand: eofbit NOT set.
get pointer is:2000

G++ 版本信息:$ g++ -v使用内置规范。目标:x86_64-linux-gnu配置: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' -with-gxx-include-dir=/usr/include/c++/4.4 [snip]gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

$ uname -aLinux hostx 2.6.32-36-server #79-Ubuntu SMP 星期二 十一月 8 22:44:38 UTC 2011 x86_64 GNU/Linux

fseek()的开放组规范(可能用于实现fstream::seekg)是必需的,以允许文件位置超出当前文件末尾:

fseek() 函数应允许在文件中现有数据的末尾之外设置文件位置指示器。如果稍后在此写入数据,则在间隙中对数据的后续读取应返回值为 0 的字节,直到数据实际写入间隙。

http://pubs.opengroup.org/onlinepubs/009696699/functions/fseek.html