User Tools

Site Tools


programming:cpp:binary

This is an old revision of the document!


バイナリ入出力

バイナリ入出力をする方法.
テキスト入出力するよりバイナリ入出力したほうがファイルサイズが小さくなるので使った.
ROOT を使っている限りは気にする必要がないが, emulsion とのデータをやり取りするために必要だった.

たとえば以下のようなクラスをかんがえる.

class Myclass {
public : 
  int var1;
  double var2;
  std::vector<double> vec;
};

読み取りは以下のように行う.

#include <fstream>
#include <vector>
#include <iomanip>
 
#include "MyClass.hpp"
 
bool ReadMyClassHeader(std::ifstream &ifs, MyClass myclass, int &vec_size) {
  if (!ifs.read((char*)& myclass.var1, sizeof(int))) return false;
  if (!ifs.read((char*)& myclass.var2, sizeof(double))) return false;
  if (!ifs.read((char*)& vec_size, sizeof(int))) return false;
  return true;
}
 
int main() {
  std::string filename = "test.bin";
  std::ifstream ifs(filename, std::ios::binary);
  std::vector<MyClass> vec_myclass;
  MyClass myclass;
  int vec_size = 0;
  while ( ReadMyClassHeader(ifs, myclass, vec_size) ) { // ここで vector 以外の読み取りが終わっている
    myclass.vec.clear();
    myclass.vec.reserve(vec_size);
    for ( int i = 0; i < vec_size; i++ ) {
      double tmp;
      ifs.read((char*)& tmp, sizeof(double));
      myclass.vec.push_back(tmp);
    }
    vec_myclass.push_back(myclass);
  }
 
  for ( auto imyclass : vec_myclass ) {
  // 適当な処理
  }
 
  std::exit(0);
 
}

書き込みは以下のように行う.

 
programming/cpp/binary.1649661744.txt.gz · Last modified: 2022/04/11 07:22 by odagawa