バイナリファイルの書き込み
数式データをバイナリ形式として出力します。
バイナリを使う理由としては、出力されるファイルのデータが小さいことと、ファイルの一部分のみを読み込むときに、読み込みやすいところです。
#include <iostream> #include <fstream> using namespace std; /* コンパイルできないときは上の3行を #include <iostream.h> #include <fstream.h> に変えてみてください。*/ int main(){ ofstream fout; double a[100]; //文字列ではないデータ fout.open("file.txt", ios::out|ios::binary|ios::trunc); // ファイルを開く // ios::out は書き込み専用(省略可) // ios::binary はバイナリ形式で出力(省略するとアスキー形式で出力) // ios::truncはファイルを新規作成(省略可) // ios::addにすると追記になる if (!fout) { cout << "ファイル file.txt が開けません"; return 1; } // ファイルが開けなかったときのエラー表示 for(int i=0;i<100;i++){ a[i]=1.0*double(i); fout.write(( char * ) &a[i],sizeof( double ) ); //文字列ではないデータをかきこむ // 「sizeof( double )」バイトの「char *」ポインタ「a[i]」をデータとして出力 } fout.close(); //ファイルを閉じる return 0; }
バイナリファイル全体の読み込み
先ほど出力したデータを読み込みます。
#include <iostream> #include <fstream> using namespace std; int main(){ char outfile[] = "file.txt"; //読み込むファイルの指定 ifstream fin( outfile, ios::in | ios::binary ); // ファイルを開く // ios::in は読み込み専用 ios::binary はバイナリ形式 if (!fin){ cout << "ファイル file.txt が開けません"; return 1; } // ファイルが開けなかったときの対策 double d; //文字列ではないデータ while(!fin.eof()){ //ファイルの最後まで続ける fin.read( ( char * ) &d, sizeof( double ) ); //文字列ではないデータを読みこむ cout << d << endl; } fin.close(); //ファイルを閉じる return 0; }
バイナリファイル一部分の読み込み
指定した場所のデータを読みとります。
バイナリで出力した理由の一つは、指定した場所のデータを読みとるのが容易だからです。
#include <iostream> #include <fstream> using namespace std; int main(){ char outfile[] = "file.txt"; int k; ifstream fin ( outfile, ios::in | ios::binary ); if (!fin){ cout << "ファイル file.txt が開けません"; return 1; } double d; //文字列ではないデータ cout << "何番目のデータを読み込みますか"<<endl; cin >> k; fin.seekg ( k*sizeof ( double ) ); //ポインタの位置を移動 fin.read( ( char * ) &d, sizeof( double ) ); //文字列ではないデータを読みこむ cout << k << '\t' << d << endl; fin.close(); return 0; }