为什么后面的数据读取会失败呢?
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读æä½åºéçåå ãå®é åºéçæ¶åï¼éè¦ç»åç°è±¡å代ç 综ååææè½å¾å°åç¡®çç»æã
文件读取时,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读取已经读完了所有内容,而不是你红线画出来的那一点儿。
这样还是不行呀?
这要怎样才能不让%s把全部数据读完啊?就算fprintf("fp,"%s “,info[i].name);好像加了空格也没用呀?fscanf(fp,"%s ",info[i].name);
现在出错是其他原因了。fscanf读取字符串的时候是用字符数组名,但读取整数时得用&。
在fscanf math、Chinese和English的时候你忘了加&了。
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<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;
}
fprintf(fp,"%s %d %d %d\n",Info[i].name,Info[i].Math,Info[i].Chinese,Info[i].English);
注意空格。应该就可以了追问
那么是什么原因导致我读取失败呢?就是控制台上出现的aa后面的一长串的东西。为什么不能读取成功呢?好费解。
追答读取字符串是 使用的是地址,需加空格 与 其他分离
追问我觉得问题是处在文件的读取上,因为文件的写入那里没错,我打开f.txt文件看了,输入的数据都在里面没异常。所以我想会不会是在读取这里出问题了。可是我还没找出问题到底在哪里?