C ++读取二进制数据以进行结构化

C++ reading binary data to struct

我目前正在读取一个我知道其结构的二进制文件,我正试图将其放入一个结构中,但是当我读取二进制文件时,我发现当它单独打印出结构时,它似乎出来是对的,但在第四次阅读时,它似乎将它添加到最后一次阅读的最后一个成员上。

这里的代码可能比我解释它的方式更有意义:

结构

#pragma pack(push, r1, 1)
struct header
{
    char headers[13];
    unsigned int number;
    char date[19];
    char fws[16];
    char collectversion[12];
    unsigned int seiral;
    char gain[12];
    char padding[16];

};

主要

  header head;
  int index = 0;
  fstream data;
  data.open(argv[1], ios::in | ios::binary);
  if(data.fail())
    {
      cout << "Unable to open the data file!!!" << endl;
      cout << "It looks Like Someone Has Deleted the file!"<<endl<<endl<<endl;
      return 0;

    }
   //check the size of head
   cout << "Size:" << endl;
   cout << sizeof(head) << endl;
   data.seekg(0,std::ios::beg);




   data.read( (char*)(&head.headers), sizeof(head.headers));

   data.read( (char*)(&head.number), sizeof(head.number));

   data.read( (char*)(&head.date), sizeof(head.date));

   data.read( (char*)head.fws, sizeof(head.fws));


//Here im just testing to see if the correct data went in.
   cout<<head.headers<< endl;
   cout<<head.number<< endl;
   cout<<head.date<< endl;
   cout<<head.fws<< endl;


   data.close();

   return 0;

输出

Size:
96
CF001 D 01.00
0
15/11/2013 12:16:56CF10001001002000
CF10001001002000

出于某种原因,fws 似乎添加到 head.date?但是当我取出线来阅读 head.fws 我得到一个没有添加任何内容的日期?

我也知道 header 需要更多数据,但我想检查数据是否正确

干杯

1. 您的日期声明为:

char date[19];

2. 您的日期格式正好是 19 个字符长:

15/11/2013 12:16:56

3. 然后你这样打印:

cout<<head.date

简而言之,您尝试使用其地址打印 fixed char[],这意味着它将被解释为 null-terminated c 字符串。它是空终止的吗?号

要解决此问题,请将 date 声明为:

char date[20];

填写后,追加空终止符:

date[19] = 0;

它适用于所有成员,将被解释为字符串文字。

您有 char date[19] 填充了 15/11/2013 12:16:56,正好是 19 个有效字符。这不会留下 space 用于终止 null,因此执行 cout << head.date 输出 19 个有效字符,然后是一堆垃圾。