C语言关于文件的问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 06:38:42
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE *fp;
char a;
int t,count=1;
if((fp=fopen("文本文档.txt","r")) == NULL)
{
printf("File open error! \n");
exit(0);
}
while(! (t=feof(fp)))
{
fscanf(fp,"%c",&a);
if(a=='\n')
printf("\n"),count++;
else if(a<='Z'&&a>='A')
printf("%c",a-'A'+'a');
else
printf("%c",a);
}
printf("\n%d",count);
if(fclose(fp))
{
printf("Can not close the file! \n");
exit(0);
}
return 0;
}
我的文本是
a
A
输出是
a
aa
2
为什么最后会输出两个a的?

改为这个就ok了
while(1)
{
fscanf(fp,"%c",&a);
if(feof(fp))
break;
......
讲了A之后,feof()还是0,再读一次,feof()才为非0.最后一次读什么也没读到,a没有娈

if(a=='\n')
{
printf("\n"),count++;
}

while (!(t=feof(fp)))这个条件不是文件内容结束的完全条件,简单给你分析:
你文件有两行内容,
a
A
实际上文件中存储在3个字符:a,'\n',A;
则进入循环之初,循环条件成立,第一次循环读取a,显示a
第二次循环,条件依然成立,读取'\n',显示换行
第三次手环,读取A,显示a,这时候文件指针指向文件末尾。
此时程序将将入第四循环条件判断,这个地方比较微妙,feof()函数是这样,
在文件指针指向文件结束处时,如果之前没有read/write操作,是不会返回错误的,只有在文件指针指向末尾且在此之后执行r/w,feof再会检测到错误。这点不难理解,比方说一个空文件(已存在的文件),你open之后,如果不read,feof是检测不到错误的,feof也没有理由说文件出错,只有在尝试向文件读根本没有的内容或者其它io错误时,feof才返回真。
于是,第四次循环依然成立,程序依然调用了scanf,但这时scanf不能从文件中读取到内容,上次读到的A还在原来的变量里,所以还是在屏幕上打出了a。
第五次循环条件不再成立,原因上面已经分析过了。
所以正错的做法是判断scanf的返回值,如果小于1那就是没读到内容,说明文件错误或者结束,这时应该终止循环。