86

マニュアルでこれを見逃しただけだと思いますが、ヘッダーistreamから C++ のクラスを使用してファイルのサイズ (バイト単位) をどのように決定しますか?fstream

4

5 に答える 5

99

ios::ateフラグ(およびios::binaryフラグ)を使用してファイルを開くことができるため、tellg()関数はファイルサイズを直接提供します。

ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
于 2012-11-15T09:00:17.093 に答える
68

最後までシークしてから、差を計算できます。

std::streampos fileSize( const char* filePath ){

    std::streampos fsize = 0;
    std::ifstream file( filePath, std::ios::binary );

    fsize = file.tellg();
    file.seekg( 0, std::ios::end );
    fsize = file.tellg() - fsize;
    file.close();

    return fsize;
}
于 2010-03-09T14:04:41.443 に答える
39

tellgファイルの正確なサイズを決定するために使用しないでください。によって決定される長さtellgは、ファイルから読み取ることができる文字数よりも大きくなります。

stackoverflow の質問tellg() 関数から、ファイルのサイズが間違っていますか? tellgファイルのサイズも、バイト単位の先頭からのオフセットも報告しません。後で同じ場所を探すために使用できるトークン値を報告します。(型を整数型に変換できることさえ保証されていません。) Windows (およびほとんどの非 Unix システム) の場合、テキスト モードでは、tellg が返す内容と、その位置に到達するために読み取らなければならないバイト数との間の直接的かつ直接的なマッピングはありません。

読み取ることができる正確なバイト数を知ることが重要な場合、確実にそれを行う唯一の方法は読み取ることです。次のようなものでこれを行うことができるはずです:

#include <fstream>
#include <limits>

ifstream file;
file.open(name,std::ios::in|std::ios::binary);
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 );
于 2016-06-14T09:29:26.167 に答える
9

このような:

long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size: " << (end-begin) << " bytes." << endl;
于 2010-03-09T14:06:22.437 に答える
-6

私は初心者ですが、これは私の独学の方法です:

ifstream input_file("example.txt", ios::in | ios::binary)

streambuf* buf_ptr =  input_file.rdbuf(); //pointer to the stream buffer

input.get(); //extract one char from the stream, to activate the buffer
input.unget(); //put the character back to undo the get()

size_t file_size = buf_ptr->in_avail();
//a value of 0 will be returned if the stream was not activated, per line 3.
于 2013-09-06T03:08:16.250 に答える