seekg,tellg,从零开始计数和文件大小

时间:2013-01-27 12:02:42

标签: c++ file-io fstream ifstream

所以,我很好奇,因为我一直在使用这种相当有用的方法来获取文件的大小,但有些事情困扰我。将流锁定到文件系统上的文件和

fileStream.seekg(0, std::ios::beg);
int beginning = fileStream.tellg();

收益率0.这是预期的,我们使用从零开始计数的好处。我感兴趣的是512字节的文件的位置在[0,511]范围内,因此,返回值

fileStream.seekg(0, std::ios::end);
int end = (int)fileStream.tellg(); // We don't care for +4GB here

应该为结束产生511,因为它是最后一个字节。加载文件中的最后一个位置。因此,用于在流中读取的任何缓冲区只能获得511个字节,而不是512个字节。

但它有效,所以你可以看到我的困惑。是什么赋予了?我不知所措。 +1来自哪里?

1 个答案:

答案 0 :(得分:3)

之后,

fileStream.seekg(0, std::ios::end);

文件指针位于最后一个字节后的位置(#511)。这是512表示的数字。在这里,511意味着就在最后一个字节之前。

让我们考虑一个长度为两个字节的文件:

  • 位置0在第一个字节之前;
  • 位置1在第二个字节之前;
  • 位置2在(不存在的)第三个字节之前,即在文件的末尾。