C语言fread为什么会读取失败呢?

为什么后面的数据读取会失败呢?... 为什么后面的数据读取会失败呢? 展开
 我来答
风若远去何人留
2015-11-13 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450134
专业C/C++软件开发

向TA提问 私信TA
展开全部
fread是用来读取文件的函数,其形式为

size_t fread ( void *buffer, size_t size, size_t count, FILE *file) ;
功能为从文件指针file中,每次读取size长度数据,读取count次,并将结果存到buffer中。
其出错的可能原因包括:
1 文件没有打开,或打开失败。即文件指针非法。当文件不存在,或用户对文件没有读权限,目标文件被占用等情况下,打开文件会失败,这时file指针值为NULL。
2 文件打开时,并没有指定读属性。
3 文件IO错误。如在文件打开后,文件被其它程序强制删除,或取消可读属性等。
4 文件达到文件尾。如果文件已经读到文件尾,不存在size*count字节的可读数据,fread会出错。
5 传入的buffer非法。如buffer为空,或buffer拥有的空间不足以存储size*count字节的数据,导致越界访问。

以上即为常见的fread读操作出错的原因。实际出错的时候,需要结合现象及代码综合分析才能得到准确的结果。
冰火梦幻
2014-01-09 · TA获得超过2308个赞
知道小有建树答主
回答量:1095
采纳率:57%
帮助的人:430万
展开全部

文件读取时,FILE *指向一个结构,里面有个指针指向硬盘上f.txt的某个位置。

刚刚用"r"为参数调用fopen时,该指针指向f.txt的开头。

然后每读取一个字节,该指针都会忘f.txt的末尾移动。移动到最后就变成EOF(End Of File)了。


当整个文件的内容都被你读完,也就是说指针已经指向f.txt的最末尾了,那时任何类型的文件读取都会失败(除非你fclose后再度fopen)。


fscanf(fp, "%s"模式,读取从当前位置开始直到不可见字符(空格、制表符、换行符)为止。

如果f.txt里所有内容都连在一起,光执行一次fscanf(fp, "%s"模式,所有f.txt都会被读光,fp就指向f.txt的最末尾了。


所以你想解决这个问题,唯一的办法就是把数据写入f.txt时,每个数据后面都跟上一个空格或回车。

比如fprintf(fp, "%s ", ...)或者fprintf(fp, "%d ", ...)

嫌麻烦的话也可以

for (i = 0; i < n; i++)
    fprintf(fp, "%s %d %d %d\n", info[i].name, info[i].math, info[i].Chinese, info[i].English);

这样。

更多追问追答
追问

第一次读取的不是只是下面红线部分吗?怎么会遇到EOF啊?

EOF应该在最后一个70后面啊?

追答
我说的第一次读取,指的是i = 0时的fscanf(fp, "%s", info[i].name);。不包括下面对math,Chinese和English的3个fscanf。即使是i = 0时,这后三个fscanf也都是失败的。
原因我已经说了:用"%s"读取时,会从当前位置一直读到不可见字符(或文件结束)为止。如果没有不可见字符,就会一直读下去,读100个字节甚至100000个字节都有可能。换言之,i = 0时的那个%s读取已经读完了所有内容,而不是你红线画出来的那一点儿。
来自:求助得到的回答
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tattackor
2015-10-29 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:895万
展开全部

1、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获取错误信息或检测是否到达文件结尾。
2、例程:

#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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰血无双
2014-01-09 · TA获得超过246个赞
知道小有建树答主
回答量:436
采纳率:100%
帮助的人:324万
展开全部
写入文件是用
fprintf(fp,"%s %d %d %d\n",Info[i].name,Info[i].Math,Info[i].Chinese,Info[i].English);
注意空格。应该就可以了
更多追问追答
追问
那么是什么原因导致我读取失败呢?就是控制台上出现的aa后面的一长串的东西。为什么不能读取成功呢?好费解。
追答
读取字符串是 使用的是地址,需加空格 与 其他分离
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
D雨落天空
2020-07-04
知道答主
回答量:4
采纳率:0%
帮助的人:2225
展开全部
可能是打开文件用的是a或者w模式,这俩模式只能用来写,a+和w+格式才能用来读
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式