c语言fread()返回总是0

Uint16BlockWrFlash[256]={0};fptr=fopen("codec.bin","rb");//加载数据ReturnLenth=256;kk=0;w... Uint16 BlockWrFlash[256]={0};
fptr = fopen("codec.bin", "rb"); //加载数据
ReturnLenth=256;
kk=0;
while(ReturnLenth==256) //加载代码
{
ReturnLenth=fread(BlockWrFlash,sizeof(short),256,fptr);
DeviceAddr=kk*0x100;
FlashWr(DeviceAddr);
delay();
kk++;
}
现在的问题出现在fread返回总是0,正常的是256才对,不知道哪里有问题了,请大大们指教!谢谢!
展开
 我来答
tattackor
2015-10-26 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:898万
展开全部

1、返回0通常是读到了文件尾。如果确认没有到文件尾,可以用ferror检查错误。
if ( ferror ( fp ) ){
printf("File read error.");
}

2、C语言中:fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
函数原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
参数:
buffer 用于接收数据的内存地址
size 要读的每个数据项的字节数,单位是字节
count 要读数据项的个数,每个数据项size个字节.
stream 输入流的指针
返回值:
返回实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。
实例:

#include<stdio.h>
#include<string.h>
int main(void)
{
FILE*stream;
char msg[]="this is a test";
char buf[20];
if((stream=fopen("DUMMY.FIL","w+"))==NULL)
{
fprintf(stderr,"Cannot open outputfile.\n");
return 0;
}
fwrite(msg,1,strlen(msg)+1,stream);
fseek(stream,0,SEEK_SET);
fread(buf,strlen(msg)+1,1,stream);
printf("%s\n",buf);
fclose(stream);
return0;
}
瓮瑗c
2013-11-29 · TA获得超过737个赞
知道小有建树答主
回答量:90
采纳率:0%
帮助的人:134万
展开全部
"codec.bin"的路径关系对么?默认走当前路径,但是根据编译环境,可能会有不同路径效果。尝试一下用绝对路径。

fseek设置一下读写位置到文件头。

如果还不行,你就把打开方式变成可读写的二进制,然后一次读一个字节。

就不信丫不听话
更多追问追答
追问
fptr = fopen("codec.bin", "rb");			//加载文件
if(fptr == NULL)
{
printf("\n读取文件失败\n");
while(1);
}else
{
printf("\n读取文件成功\n");
}
文件时打开了的,就是fread返回不正确。
追答
你没有明白我的意思。fread是库函数,我们通常不认为库函数会出错,一般都是使用上有问题才会出错。

所以要确认哪里用错了。

首先确认你打开的文件就是是你所希望的哪个23K的文件,简单的方法是确认一下路径下是否有这个有效文件。最好的方法是用fstat函数,取一下文件属性,其中会有文件的大小。如果不对,一下就看出来了

确认了文件之后,那么我猜测是读不到有效字节,一种可能是读写指针在文件尾巴,所以你可以用fseek函数将读写指针定位到文件的起始位置,这就确保一定可以读到内容。

为了最简化调试,你一次只读一个字节。如果ReturnLenth不再得到0,就说明文件可以正常操作的。

那么再扩展到256个short,还有,我建议,sizeof(Uint16),防止不同编译器short的size不同,导致堆栈溢出,覆盖掉其他局部变量

还有你的ReturnLenth是什么类型的?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
478617
2013-11-29 · TA获得超过875个赞
知道小有建树答主
回答量:725
采纳率:100%
帮助的人:96.4万
展开全部
你没有检查fopen不成功的情况,即

fptr = fopen("codec.bin", "rb"); //加载数据

后加
if(fptr ==NULL)
{
printf("file can't open!\n");
return ;
}
可能是打开文件错误造成的。
更多追问追答
追问
添加了,打开成功,直接执行下面的程序,但是fread返回值还是0.

fptr = fopen("codec.bin", "rb"); //加载数据

if(fptr == NULL)
{
printf("\n读取文件失败 \n");
while(1);
}
追答
你那个while(ReturnLenth==256)使得ReturnLenth为256时一直在做循环,直到它不等256为止,所以ReturnLenth在函数返回内是不会等于256的
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-29
展开全部
不会是codec.bin文件里面就是空的吧。。。
追问
codec.bin有23kb呢,以前用过是成功的,现在是自己修改了启动方法,所以读取方式改变了,就不能用了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式