マニュアルでこれを見逃したと思いますが、C++のistream
ヘッダーからのfstream
クラスを使用して、ファイルのサイズ(バイト単位)をどのように決定しますか?
_ios::ate
_フラグ(および_ios::binary
_フラグ)を使用してファイルを開くことができるため、tellg()
関数はファイルサイズを直接提供します。
_ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
_
最後までシークし、差を計算できます:
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;
}
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 );
このような:
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;