CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

用一个结构体读二进制文件的问题??

楼主zhipeng0117()2006-03-04 13:24:14 在 VC/MFC / 基础类 提问

这个二进制文件的结构是这样的: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

相关问题

  • 二进制文件?
  • 关于二进制文件
  • 写二进制文件
  • 二进制文件读写
  • 如何计算一个二进制文件里存储多少个结构体类型的数据?希望高手指点。
  • vb里的窗体二进制文件.frx文件怎么用呀?
  • 二进制变量怎样保存到二进制文件中
  • 如果读出二进制文件的二进制值
  • 如何在窗体上打印二进制文件的内容呢?
  • 如何得知具体代码在二进制文件中的地址

关键词

  • 结构
  • 数据
  • cfile
  • double
  • part
  • 类型
  • 值
  • dat
  • 问题
  • bb

得分解答快速导航

  • 帖主:zhipeng0117
  • lfchen

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo