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 个有效字符,然后是一堆垃圾。
我目前正在读取一个我知道其结构的二进制文件,我正试图将其放入一个结构中,但是当我读取二进制文件时,我发现当它单独打印出结构时,它似乎出来是对的,但在第四次阅读时,它似乎将它添加到最后一次阅读的最后一个成员上。
这里的代码可能比我解释它的方式更有意义:
结构
#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 个有效字符,然后是一堆垃圾。