C ++ добавить структуру в двоичный файл - PullRequest
1 голос
/ 26 июля 2011

У меня есть моя структура:

struct a
{
  int    x;
  float  f;
  double d;
  char   c;
  char   s[50];
};

, и я хочу каждый раз добавлять в расписание таймера в двоичный файл.

// declaration
std::ofstream outFile;

// constructor:
outFile.open( "save.dat", ios::app );

// tick:
outFile << a << endl;

, но внутри save.dat появляется только это:

0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..

заранее спасибо

Ответы [ 2 ]

6 голосов
/ 26 июля 2011

В данный момент вы пишете адрес определения структуры.
То, что вы хотите сделать, это использовать ostream :: write

outfile.write(reinterpret_cast<char*>(&myStruct), sizeof(a));

Это будет работать до тех пор, пока ваша структура имеет тип POD (Plain Old Data) (как в вашем примере). Тип POD означает, что все члены имеют фиксированный размер.

Если у вас есть члены переменного размера, вам нужно будет записать каждый элемент по одному.

2 голосов
/ 26 июля 2011

Разумным способом сериализации пользовательских объектов является перегрузка собственного оператора выходного потока:

std::ostream & operator<<(std::ostream & o, const a & x)
{
  o.write(reinterpret_cast<char*>(&x.x), sizeof(int));
  o.write(reinterpret_cast<char*>(&x.f), sizeof(float));
  /* ... */
  return o;
}

a x;
std::ofstream ofile("myfile.bin", std::ios::binary | std::ios::app);
ofile << a;

Это все еще зависит от платформы, поэтому, чтобы быть немного более безопасным, вам, вероятно, следует использовать данные фиксированной ширинытипы типа int32_t и т. д.

Возможно, семантически не самая лучшая идея семантически использовать << для двоичного вывода, поскольку он часто используется для вывода в формате .Возможно, более безопасный метод - написать функцию void serialize(const a &, std::ostream &);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...