バイナリファイルの読み込みと書き込み C++

バイナリファイルの書き込み

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

#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;
}