C++でクラスや構造体をファイルにシリアライズする感じのサンプルコード。

ちなみに、構造体 Data に std::string を入れてみたら Segmentation fault で異常終了したので該当部分をコメントアウトしてある。


#include <cstdio>
#include <cstring>
#include <string>
 
typedef struct {
  int x;
  int y;
}Point;
 
typedef struct {
  char str[256];
  int len;
}SString;
 
class CString {
public:
  CString(){
  };
  virtual ~CString(){
  };
  void set(const char *s){
    strcpy(str, s);
  };
  const char *get(){
    return str;
  }
private:
  char str[256];
  int len;
};
 
typedef struct {
  int a;
  double b;
  Point c;
  //std::string d;
  SString e;
  CString f;
}Data;
 
int main(void){
  // 書きこむデータ
  Data data1;
  memset(&data1, 0, sizeof(Data));
  data1.a = 123;
  data1.b = 4.5;
  data1.c.x = 67;
  data1.c.y = 89;
  //data1.d = "abcde";
  strcpy(data1.e.str, "fghij");
  data1.e.len = 5; 
  data1.f.set("klmno");
  // ファイルへ書きこむ
  FILE *fp;
  fp = fopen("data.dat", "wb");
  fwrite(&data1, sizeof(Data), 1, fp);
  fclose(fp);
  fp = 0;
  // 読み込むデータ
  Data data2;
  // ファイルから読みこむ
  fp = fopen("data.dat", "rb");
  fread(&data2, sizeof(Data), 1, fp);
  fclose(fp);
  fp = 0;
  // 読み込んだデータを出力
  printf("a=%d\n", data2.a);
  printf("b=%f\n", data2.b);
  printf("c.x=%d\n", data2.c.x);
  printf("c.y=%d\n", data2.c.y);
  //printf("d=%s\n", data2.d.c_str());
  printf("e=%s\n", data2.e.str);
  printf("f=%s\n", data2.f.get());
  return 0;
}

コンパイルして実行。
ファイルへ書きだした構造体の値を読み込んで表示できている。


$ g++ ./stsample.cpp 
$ ./a.out 
a=123
b=4.500000
c.x=67
c.y=89
e=fghij
f=klmno

tags: c++

Posted by NI-Lab. (@nilab)