1

ファイルのサイズを取得するためにこのかなり便利なアプローチを使用してきたので、私は興味がありますが、何か気になります。ファイル システム上のファイルへのストリームをロックし、

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

これは当然のことです。ゼロベースのカウントの利点を利用しています。私にとって興味深いのは、512 バイトのファイルの位置が [0, 511] の範囲にあるため、次の値を返すことです。

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

これは最後のバイトであるため、end には 511 が返されます。ロードされたファイル内の最後の位置。したがって、ストリームの読み取りに使用されるバッファは、512 バイトではなく 511 バイトしか取得できません。

しかし、それはうまくいくので、私の混乱を見ることができます。何を与える?私は途方に暮れています。+1はどこから来ますか?

4

1 に答える 1

3

後、

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

ファイル ポインタは、最後のバイトの直後の位置です (#511)。これが512という数字が示すものです。ここで、511 は最後のバイトの直前を意味します。

長さが 2 バイトのファイルを考えてみましょう。

  • 位置 0 は最初のバイトの前です。
  • 位置 1 は 2 番目のバイトの前です。
  • 位置 2 は、(存在しない) 3 番目のバイトの前、つまりファイルの末尾です。
于 2013-01-27T12:05:28.693 に答える