ホームページ >バックエンド開発 >C++ >C で `tellg()` がファイル サイズを正確に報告しないのはなぜですか?

C で `tellg()` がファイル サイズを正確に報告しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-02 20:56:11119ブラウズ

Why Does `tellg()` Not Accurately Report File Size in C  ?

tellg() の誤解: ファイル サイズの報告

コード スニペットで、tellg() 関数が値を返すという問題が発生しました。 read() 関数によって読み取られるファイルの実際のサイズよりも大きくなります。この矛盾は、tellg() の目的の誤解から生じています。

Tellg の関数

一般的な考えに反して、tellg() は、ファイル、または先頭からのオフセット (バイト単位)。代わりに、トークン値、つまり後でファイル内の同じ位置に戻るために使用できるプレースホルダーを返します。実際に返される数値は、オペレーティング システムとファイル モードによって異なります。

実際の実装

実際には、Unix システムでは、tellg() はバイト単位でオフセットを返します。 , Windows では、バイナリ モードで開かれたファイルのオフセットのみを返します。 Windows のテキスト モードの場合、戻り値は、その位置に到達するために必要なバイト数を正確に反映していない可能性があります。

正確なバイト数

バイト数を正確に判断するには読み取り可能なバイト数が限られている場合、信頼できる唯一の方法は読み取り操作を実行することです。これは、次のような手法を使用して実現できます:

#include <limits>

file.ignore( std::numeric_limits<std::streamsize>::max() );
std::streamsize length = file.gcount();
file.clear();   //  Since ignore will have set eof.
file.seekg( 0, std::ios_base::beg );

その他の観察

tellg() の問題に加えて、コードには追加のエラーが含まれています:

  1. 行「buffer = new char[length];」 「*buffer = new char[length];」である必要があります。文字の配列へのポインタを割り当てます。
  2. 文字ごとに読み取る場合、2 番目の for ループのループ条件は while ( file.get(buffer[i] ) ) である必要があります。
  3. ファイルを開くのに失敗した場合に備えて、エラー処理を実装する必要があります。

これらの問題に対処することで、コードはファイルのサイズを正確に判断し、読み取りを実行できるようになります。意図したとおりに動作します。

以上がC で `tellg()` がファイル サイズを正確に報告しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。