用一个结构体读二进制文件的问题??
这个二进制文件的结构是这样的:3个int类型数据和3个double类型数据作为一块,不断重复。一次定义了一个结构体来一块一块读
{
int x1;
int x2;
int x3;
double y1;
double y2;
double y3;
}
读出来的结果,后面三个数是不合理的值。但是用两个结构体
{ {
int x1; double y1;
int x2; 和 double y2;
int x3; double y3;
} }
把每一块分两部分读,就能得到正确的结果。是不是int 和 double数据不能一起读呢?
问题点数:20、回复次数:8Top
1 楼syy64(太平洋)回复于 2006-03-04 13:30:12 得分 0
那可能是你读语句的缘故,贴出源码。Top
2 楼lfchen(一条晚起的虫--床上用品[家纺]专卖)回复于 2006-03-04 20:28:13 得分 0
数据对齐Top
3 楼zbplusplus(于是开始苏鲁之的堕落)回复于 2006-03-04 20:40:55 得分 0
#define param(1) //(好像是这么拼的)
如果不想处理对齐问题就把数据读到char[],然后逐个成员用memcpy复制,记住,必须是逐个成员,而且是memcpy
改变默认的对齐方式可能会产生效率低下的代码
Top
4 楼zhipeng0117()回复于 2006-03-04 21:07:44 得分 0
楼上,源代码是这样的
CFile file;
file.Open("test.dat",CFile::modeReadWrite|CFile::modeCreate);
int x1=123, x2=456,x3=789;
double y1=123, y2=456,y3=789;
file.Write(&x1,4);
file.Write(&x2,4);
file.Write(&x3,4);
file.Write(&y1,8);
file.Write(&y2,8);
file.Write(&y3,8);
file.Close();
struct part1
{
int a1;
int a2;
int a3;
double b1;
double b2;
double b3;
}bb;
file.Open("test.dat",CFile::modeRead|CFile::typeBinary);
file.Read(&bb,sizeof(part1));
file.Close();
这样得到的b1,b2,b3值是错的(极小的值)。但我把int类型和double类型分别放在两个结构体中依次去读,就得到了正确的结果。即
struct part1
{
int a1;
int a2;
int a3;
}aa;
struct part2
{
double b1;
double b2;
double b3;
}bb;
file.Open("test.dat",CFile::modeRead|CFile::typeBinary);
file.Read(&aa,sizeof(part1));
file.Read(&bb,sizeof(part2));
file.Close();
Top
5 楼lfchen(一条晚起的虫--床上用品[家纺]专卖)回复于 2006-03-04 21:30:01 得分 0
主要是由于结构体出于读写速度的考虑,会有数据对齐的发生。
sizeof(part1)的并不是你想象的4*3+8*3=36
Top
6 楼lfchen(一条晚起的虫--床上用品[家纺]专卖)回复于 2006-03-04 21:40:01 得分 20
#pragma pack(4)
可以指定为4字节对齐,那么你的代码就没有问题了
你的那个结构,默认按照8字节(double长度)对齐,size应该是40(32<36<40)Top
7 楼blueriver1981(b.l.u.e.river)回复于 2006-03-04 23:28:00 得分 0
定义结构体一定要注意字节对齐的问题Top
8 楼zhipeng0117()回复于 2006-03-05 20:23:01 得分 0
谢谢大家帮忙,我再试试
我新来只有20分,不能一一给了,请见谅Top




