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 | - | 新規作成 |