游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4323|回复: 10

fread函数的反传统用法,请大家帮忙解释!自己怎么也想

[复制链接]

39

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2005-10-26 19:03:00 | 显示全部楼层 |阅读模式
看到一个读取3dmax标准输出文件-3ds格式文件的类,其中读取文件数据的fread函数用的我莫名其妙,但是这个类绝对正规,肯定是我哪里不懂。


UINT version;


fread(&version, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);


-------------------------------------------------------------------------------------------------------------

fread()函数的格式第2项不是要读取的变量的大小吗?而version是UINT类型的变量,我认为应该这么写吗

fread(&version,         sizeof(version)        , m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);

为什么第二项的参数确是1,sizeof(version)的值应该是4啊!


1

主题

177

帖子

198

积分

注册会员

Rank: 2

积分
198
QQ
发表于 2005-10-26 19:18:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

size_t fread(  void *buffer, size_t size,size_t count,FILE *stream );
真正读取的字节数目为: size*count, 所以这两个参数调换应该没什么问题

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-10-26 19:55:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

不,如果+size以后超过了文件长度,fread就会放弃读取。返回的size_t就是实际读取的count数,不能对调的。

12

主题

70

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2005-10-26 20:57:00 | 显示全部楼层

Re: fread函数的反传统用法,请大家帮忙解释!自己怎么也

这样用没什么问题吧 ,不过是按字节来读入数据而已阿
1是指每次读一个字节,后面的是文件剩余的长度(以字节为单位)
可能 本来这个文件的length就是用字节长度来表示的,所以在读的时候就直接还是一个字节一个字节的读了

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2005-10-27 04:02:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

应该没问题

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-10-27 14:04:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

反个屁传统啊
fread就那几个参数
怎么反?

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-10-27 14:06:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

fread()函数的格式第2项不是要读取的变量的大小吗?而version是UINT类型的变量,我认为应该这么写吗

fread(&version,         sizeof(version)        , m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);

为什么第二项的参数确是1,sizeof(version)的值应该是4啊!

=======================================
这才是愚蠢的写法.。。。这样很可能会破坏堆栈
你哭都哭不来

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-10-27 14:07:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

fread(&version,         sizeof(version)        , m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);

====================
改成fread(&version,         sizeof(version)        , 1, m_FilePointer);还差不多
要不然我保证你程序崩溃

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-10-27 14:09:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

原作者那样写的目的很明显:
因为要读取的内容可能是1-4位之间的任何一种可能,version所以用了m_CurrentChunk->length - m_CurrentChunk->bytesRead .来算要读多少位.

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-10-27 14:11:00 | 显示全部楼层

Re:fread函数的反传统用法,请大家帮忙解释!自己怎么也

实际上在读3ds文件时也没必要这么小心....
现在3ds版本是3.0 ,version是四位...可以直接读.
相对来说,我更喜欢一次性加载全部文件内容,再分析.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 10:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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