バイナリファイルの書き込み
数式データをバイナリ形式として出力します。
バイナリを使う理由としては、出力されるファイルのデータが小さいことと、ファイルの一部分のみを読み込むときに、読み込みやすいところです。
#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;
}