web-dev-qa-db-ja.com

C ++ファイルストリーム(fstream)を使用して、どのようにしてファイルのサイズを決定できますか?

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

71
warren

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

_ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
_
86
Pepus

最後までシークし、差を計算できます:

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;
}
57
AraK

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

このような:

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;
9
Philip