rdbuf->in_avail()でファイルサイズ取得は危険じゃね?

もしかしたらWindows環境だけのことで、他のOSでは問題ないのかもしれないけど(いや、そんなことはないと思うけど)

C++でファイル読込みするときに、fstreamだけを使ってファイルサイズを得る方法をググると、

//ファイルを開く
ifstream ifs("test.dat", std::ios_base::binary);

//ファイルサイズ取得?
streamsize size = ifs.rdbuf()->in_avail();

なんて感じのコードが結構でてくるんだけど、ちょっと待って欲しい。

in_avail()の戻り値はMSDNによると

バッファから読み取ることが準備完了している要素の数です。

ということで、ストリームバッファ内で現在利用可能なバイト数なんですよ。

なので、小さなファイルならいいけど、ストリームバッファのサイズを超えるファイルのサイズを得ようと思っても、バッファの上限までしか得られない。
環境によって違うかもしれないけど、さっき試したら4096以上は返ってこなかった。

じゃぁどうしたらいいかというと、

//ファイルを開く
ifstream ifs("test.dat", std::ios_base::binary);

//ファイルの最後の位置(=ファイルサイズ)を得る
size_t fileSize = (size_t)ifs.seekg(0, std::ios::end).tellg();

//ファイル読み取り位置を先頭に戻す
ifs.seekg(0, std::ios::beg);

コレで正確なファイルサイズが取れる。

速度はもしかしたらin_avail()の方が早いかもしれないから、扱うファイルのサイズが小さいことが解ってるならin_avail()を使った方が良いのかもしれないね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.