ホームページ >バックエンド開発 >C++ >C の `tellg()` 関数を使用してファイルのサイズを正確に判断するにはどうすればよいですか?

C の `tellg()` 関数を使用してファイルのサイズを正確に判断するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-09 10:00:19637ブラウズ

How Can I Accurately Determine a File's Size Using C  's `tellg()` Function?

tellg() ファイル サイズの推定における誤解

C の Tellg() 関数は、特定のデータを表すトークン値を返すように設計されています。ファイル内の位置。この値は、後で seekg() 関数を使用してその位置に戻るために使用できます。ただし、tellg() はファイルのサイズをバイト単位で直接提供しないことに注意することが重要です。

提供されたコード内:

void read_file(const char* name, int *size, char*& buffer) {
  ifstream file;

  file.open(name, ios::in | ios::binary);
  *size = 0;
  if (file.is_open()) {
    // Get length of file
    file.seekg(0, std::ios_base::end);
    int length = *size = file.tellg();
    file.seekg(0, std::ios_base::beg);

    // Allocate buffer in size of file
    buffer = new char[length];

    // Read
    file.read(buffer, length);
    cout << file.gcount() << endl;
  }
  file.close();
}

file.tellg() の呼び出しファイルのサイズを見積もるために使用されます。ただし、tellg() はファイル サイズを直接返さないため、このアプローチは正しくありません。

ファイル サイズを決定するための正しいアプローチ

ファイルのサイズを正確に決定するにはバイト単位で指定するには、次のアプローチを使用することをお勧めします。

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

このコードはファイルを最後まで読み取り、 gcount() 関数は、読み取られたバイト数を返します。この値は、ファイルの実際のサイズを表します。

補足

  • 変数buffer は、正しく宣言するには、char* ではなく char** として宣言する必要があります。文字配列を指します。
  • std::vector を使用することをお勧めします。または、動的にメモリを割り当てる代わりに std::string を使用して、メモリ管理を簡素化し、リークを回避します。
  • 最後の印刷ループのループ条件は i < である必要があります。 *size - 1 は、バッファの最後まで適切に印刷されるようにします。

以上がC の `tellg()` 関数を使用してファイルのサイズを正確に判断するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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