バイナリファイル 読み書き

C++ 標準のみでバイナリファイルの読み書きを行います。
バイナリデータをコンテナ(vector, list)へ格納します。

 

参考、というかそのまま使わせていただいたのは下記のURLです。
http://blogs.wankuma.com/episteme/archive/2009/01/09/166002.aspx

コードは以下のとおり。

#include <fstream>   // [io]fstream
#include <algorithm> // copy, equal
#include <vector>    // vector
#include <list>      // list
#include <iterator>  // [io]streambuf_iterator
#include <cstdlib>   // rand
#include <cassert>   // assert

using namespace std;

int main(int argc, char* argv[])
{
    vector<char>    src ;
    
    // とりあえず5万文字ほどテキトーに埋める
    for ( int i=0; i<50000; ++i ){
        src.push_back(static_cast<char>(rand()));
    }
    
    // ファイルへバイナリ書き込み
    ofstream  ostrm("test.dat", ios::binary);
    copy( src.begin(), src.end(), ostreambuf_iterator<char>(ostrm) );
    ostrm.close();
    
    // さっき書いたバイナリファイルを開いて
    ifstream    istrm("test.dat", ios::binary);
    
    // istreambuf から直接 list<char> を生成してしまう。
    std::list<char>    dest((istreambuf_iterator<char>(istrm)), (istreambuf_iterator<char>()));
    
    // ファイルを閉じる
    istrm.close();
    
    // うまくいったか、確認
    assert( src.size() == dest.size() );
    assert( equal( src.begin(), src.end(), dest.begin() ) );
    
    return EXIT_SUCCESS;
}

 

うまく動作したけれども、いまだにちょっと理解不能なのが

std::list<char>  dest((istreambuf_iterator<char>(istrm)), (istreambuf_iterator<char>()));

の部分。各引数部分の括弧をとって

std::list<char>  dest(istreambuf_iterator<char>(istrm), istreambuf_iterator<char>());

と書くとエラーになってしまう。理解不能です。
気持ち的にはどっちも同じ動作をしてほしいのですけれども。

評価環境は、VC++2008 SP1 です。OSは Windows7 64ビット です。

 

 

参考

 


 

変更履歴

2023-04-14 - ページデザイン更新
2009-12-20 - 新規作成

 

Programming Items トップページ

プライバシーポリシー