游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1324|回复: 2

请教一个关于fread()的弱智问题 :P

[复制链接]

6

主题

52

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2005-3-29 04:15:00 | 显示全部楼层 |阅读模式
我想把一个2进制数据文件的头的内容读入一个已申明号的struct中去,结果出现了以下奇怪的问题,路过的朋友帮我看看问题出在哪里好吗 :(
------------------------------------------------------------------
文件中的部分数据如下图:


------------------------------------------------------------------
以下是实现的部分程序:
typedef struct test
{
        WORD        bT;
        DWORD        bS;
        WORD        bR1;
        WORD        bR2;
        DWORD        bO;
} test;
        .
        .
        .
        CString filename="a.bmp";
        FILE *fp=fopen(filename,"r");
        if(fp==NULL)
        {
                AfxMessageBox("File not found!");
                return;
        }
        test fh;
        fread(&fh,sizeof(fh),1,fp);
//      ~~~~~~~~~~~~~~~~~~~~~~~~~~~  这里读入数据有误,fh.bS怎么会读到00004H~00007H去了,应该在00002H~00005H (0x0001012E)才对啊!?后面的都跟着错2个字节,而且sizeof(fh)为16,应该是14个字节才对啊!?稀里糊涂了! ...
        .
        .
        .
        fclose(fp);
}

------------------------------------------------------------------
这是运行后的数据情况:


------------------------------------------------------------------
搞不明白为什么会这样!
[em24] [em4] [em24] [em4]

8

主题

111

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2005-3-29 10:03:00 | 显示全部楼层

Re:请教一个关于fread()的弱智问题 :P

因为结构里的变量缺省是4字节对齐的.可以用#pragma pack ...来设定,或者编译选项里也可以设.所以尽量让你的结构里的成员变量按照4字节对齐,比如:
typedef struct test
{
WORD bT;
WORD bR1;
DWORD bS;
DWORD bO;
WORD bR2;
} test;

如果文件格式不是你自己定的话,你就老老实实读吧,先读两个byte,再读4个...

6

主题

52

帖子

52

积分

注册会员

Rank: 2

积分
52
 楼主| 发表于 2005-3-29 12:15:00 | 显示全部楼层

Re:请教一个关于fread()的弱智问题 :P

原来是这样,谢谢 :)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 00:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表