Чтение структуры из файла в C++ с несколькими типами

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

struct A
{
  int s;
  char cname[20];
};

int main () {
  A mystruct;

  ifstream is;
  is.open ("filename.txt", ios::binary );

  is.read ( &mystruct, sizeof(InpumystructtStruct) );
  is.close();

  return 0;
}

Предположим, что в двоичном файле есть несколько структур, типа struct A, struct B и struct C, с разными размерами, появляющимися в файле. Если я хочу прочитать их все по порядку, при условии, что я знаю последовательность, это будет правильно?

struct A
{
  int s;
  char cname[20];
};
struct B
{
  int s;
};    
struct A
{
  char cname[20];
};

int main () {
  A mystructa;
  B mystructb;
  C mystructc;

  ifstream is;
  is.open ("filename.txt", ios::binary );

  while( is.good()  ) {
      // determine struct to use 
      is.read ( &mystruct/*put right type*/, sizeof(/*put right tupe*/) );
  }
  is.close();

  return 0;
}

1 ответ

Нет, это не сработает.

Если вы знаете, что они были записаны последовательно в файл:

struct {
     A a;
     B b;
     C c;
} v;

is.read (&v, sizeof v);

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

Все эти виды проблем решаются с помощью универсальных форматов данных, таких как JSON, XML и т. Д.

Чуть более переносимо, этот вариант написанного вами будет работать, хотя и с теми же проблемами, что и раньше:

A mystructa;
B mystructb;
C mystructc;

is.read (&mystructa, sizeof mystructa);
is.read (&mystructb, sizeof mystructb);
is.read (&mystructc, sizeof mystructc);
Другие вопросы по тегам