1

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

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 从何而来?

4

1 回答 1

3

后,

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

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

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

  • 位置 0 在第一个字节之前;
  • 位置 1 在第二个字节之前;
  • 位置 2 在(不存在的)第三个字节之前,即文件末尾。
于 2013-01-27T12:05:28.693 回答