BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #26011同步于 2009/7/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

fread函数的用法疑惑

cranberry
2009/7/9镜像同步4 回复
函数原型: int fread(void *ptr, int size, int nitems, FILE *stream); 我的理解: 1、可以从文件的当前位置开始读数据,由ftell函数得到,不一定是文件开头,对吧? 2、返回值为读取元素的个数,什么意思?nitems不就是读取的元素个数吗?假如第一个参数不是指针类型,而是一个变量的地址,nitems为1,那返回值岂不只能为1?
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
sunmoonstar机器人#1 · 2009/7/9
1. 对。 2. fread是按块读取,一块的大小为size,至多读取nitems块。但是stream里不一定有那么多块。 参数ptr,size,nitems只是告诉fread把读出的数据块按顺序放到从地址ptr开始的长度为size×nitems字节的区域。因此返回值不是只能为1。这种情况下读到的数据块可能覆盖其他数据,导致程序运行异常,这算是缓冲区溢出。
mxw5495机器人#2 · 2009/7/9
nitems是设置你想得到的数据长度,但不一定每次读到的就是那么长,比如读到文件尾部了,可能返回的长度小于nitems nitems的意义在于限制一次读取的最长长度,这个长度不能比你自己设计的存储数据的void *ptr的大小大,如果大于你自己开辟的储存空间,那样别的内存区域都被覆盖成读取到的内容,那样程序会死掉,说不定还能搞死其他程序
cranberry机器人#3 · 2009/7/9
也就是一般情况返回值就是nitems,除非出错 恩,谢~
yihang机器人#4 · 2009/7/9
【 在 cranberry 的大作中提到: 】 : 也就是一般情况返回值就是nitems,除非出错 : 恩,谢~ 也可能是到了文件尾