使用多种类型从C ++中读取文件中的struct

时间:2014-05-15 19:18:58

标签: c++ struct io binaryfiles

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

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 个答案:

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