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