用多种类型从c++文件中读取结构体

Read struct from file in C++ with multiple types

本文关键字:文件 读取 结构体 c++ 种类 类型      更新时间:2023-10-16

我使用下面的代码从二进制文件中读取结构体。

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;
}

假设在二进制文件中有多个结构体,结构体A、结构体B和结构体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;
}

不行,不行

如果您知道它们在文件中是顺序写入的:

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);