ホームページ >バックエンド開発 >C++ >Tellg() が一貫性のないファイル サイズを報告するのはなぜですか? ファイル サイズを正確に判断するにはどうすればよいですか?

Tellg() が一貫性のないファイル サイズを報告するのはなぜですか? ファイル サイズを正確に判断するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-08 03:54:11139ブラウズ

Why Does tellg() Report Inconsistent File Sizes, and How Can I Accurately Determine File Size?

tellg() 関数が一貫性のないファイル サイズを報告する

ユーザーがファイルをバッファに読み取ろうとすると、ユーザーが使用する際に誤った結果が発生する可能性があります。 Tellg()関数。予想とは異なり、tellg() は実際のファイル サイズやバイト オフセットではなくトークン値を報告します。この矛盾は、関数の意図された目的に起因する可能性があります。

技術的には、tellg() はファイル サイズやその正確な位置をバイト単位で直接示しません。むしろ、プログラムがファイル内の同じ場所に再度アクセスできるようにするトークンを提供します。トークンの値は、整数データ型に変換できることは保証されていません。

Unix ベースのシステムでは、tellg() は通常、ファイルの先頭からのバイト オフセットを表します。ただし、Windows システムでは、その動作はファイルのオープン モードに応じて異なります。バイナリ ファイルの場合、オフセットは Unix の動作に似ています。ただし、テキスト モードでは、tellg() の出力と、特定の位置に到達するために必要な実際のバイト数の間に直接の相関関係はありません。

ファイル内の読み取り可能なバイト数を正確に判断するには、最も信頼できる方法は、読み取りプロセスを試みることです。これは、次の手順を使用して実現できます。

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 );

ここでは、無視を使用してファイルの終わりまで読み取ります。 gcount() の値は、実際のバイト数を示します。

補足:

  1. 行 *buffer = new char[length];ポインタを文字変数に割り当てようとするため、これは避けてください。代わりに、バッファを char** として宣言するか、ベクトルまたは文字列を使用することを検討してください。
  2. コードの最後のループ条件 (int i = 0; i
  3. ファイルを開くエラーの処理に失敗する (サイズを 0 に設定するなど) 可能性があります。見落とし。

以上がTellg() が一貫性のないファイル サイズを報告するのはなぜですか? ファイル サイズを正確に判断するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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