2010年1月7日木曜日

std::fstreamでファイルサイズを取得

Check
メタセコイア読み込みに関連して、std::fstreamからデータを読み込む際に必要なことのまとめ。
#include <iostream>
#include <fstream>

typedef unsigned int uint;
const char *fname = "C:/hoge/piyo.txt";//ファイルパス

int main()
{
    using namespace std;

    ifstream fs(fname);//ファイルオープン。読み込み形式は指定なしのときはテキストモードになる。

    fs.seekg(0, fstream::end);//ファイル末尾を探す
    uint eofPos = fs.tellg();//ファイル末尾インデクスを取得

    fs.clear();//先頭にもどるために一度clear()をかける。これをしないと次のseekg()でコケるときがある。

    fs.seekg(0, fstream::beg);//ファイル先頭に戻る
    uint begPos = fs.tellg();//ファイル先頭インデクスを取得

    uint size = eofPos - begPos;//末尾-先頭でファイルサイズを計算

    char *buf = new char [ size ];//サイズ分の領域を確保
    memset(buf, 0, size);//0クリアしておく

    fs.read(buf, size);//ファイル先頭からバッファへコピー

    fs.close();//ファイルを明示的に閉じてみる

    cout << buf << endl;//確認のため出力

    SAFE_DELETE_ARRAY(buf);//バッファを削除
    return 0;
}
基本は上記のとおり。

例外処理も入れるべきだが、使い方を間違えると正しく読み込めているのに例外が送出されてしまうので注意。
下記のリストに挙げた『std::ifstream::read()の使い方がツライ』の記事を参考されたい。
参考

0 件のコメント:

コメントを投稿