Чтение структуры из файла в 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);