C语言,统计文件中的字符个数

main()
{
FILE *fp;long num=0;
if((fp=fopen("fname.dat","r"))==NULL){
exit(0);
}
while(!feof(fp)){
fgetc(fp);
num++;
}
printf("文件中的字符个数为:%d",num-1);
fclose(fp);
}

请问大家,为什么num要减1??
假设文件中只有一个字符,请大家解释一下。

  使用fopen函数打开文件,使用fgetc()一个字符一个字符的读取,然后计数统计就可以啦,fget()从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节,这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。

#include<stdio.h>
int main()
{
FILE *fp;
char filename[50];
int num=0;
printf("输入一个文件名: ");
gets(filename);
if((fp=fopen(filename,"r"))==NULL)
{
printf("文件打开失败..\n");
return ;
}
while(!feof(fp))fgetc(fp)&&num++;
printf("%s æ–‡ä»¶ä¸­å…±æœ‰å­—符个数: %d\n",filename,num);
fclose(fp);
return ;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-22
while(!feof(fp)){
fgetc(fp);//最后一个收到的是文件结束符号,当然不是字符串的一部分!
num++;//而此处加了1
}
所以最后字符串的长度要减一。
而你修改后,条件先不满足,不进入循环了,没有num++的动作。
第2个回答  2010-06-20
因为eof的条件为真当且仅当文件指针读到文件末尾。而读到最后一个字符的时候它还不知道该字符是不是最后一个字符,必须再读一次失败了才行。因此度文件的次数多了一次,最后要减一。

应楼主要求,假设仅一个字符:那么循环进行两次:第一次,读了一个字符,但是不知道是不是最后一个,然后第二次再读,是EOF了,但是下一行语句就是num++,所以比实际多了1,最后要减回来。

这里涉及到c语言判断文件末的机制:其判断文件末需要读到一个不是正文的字符,也就是文件结束符EOF。读到EOF时,原本要赋值的对象的值不会改变,也就是说,读到的EOF是不能赋给变量的,EOF就是为了标记文件末(end of file)。本回答被提问者采纳
相似回答