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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;
参考技术A while(!feof(fp))
fgetc(fp);//最后一个收到的是文件结束符号,当然不是字符串的一部分!
num++;//而此处加了1

所以最后字符串的长度要减一。
而你修改后,条件先不满足,不进入循环了,没有num++的动作。
参考技术B 因为eof的条件为真当且仅当文件指针读到文件末尾。而读到最后一个字符的时候它还不知道该字符是不是最后一个字符,必须再读一次失败了才行。因此度文件的次数多了一次,最后要减一。

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

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

统计字母个数(C语言)

题目:读取文件中的字符串,统计从“a”到“z”26个字母各自出现的次数,并将结果放入数组中。如文件中有字符串abcdefgabcdeabc,输出33322110000000000000000000。
思路:这里我用letter[0] - letter[25]分别存储a-z出现的次数。letter[0]=letter[‘a’-‘a’],letter[0]存储a出现的次数;letter[1]=letter[‘b’-‘a’],letter[1]存储b出现的次数;以此类推…

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)

	char string[200];							/*string数组存放字符串*/
	int letter[26] =  0 ;						/*letter数组记录字母出现的次数*/
	unsigned int i;							
	FILE *fp;
	errno_t err;
	if ((err = fopen_s(&fp, "data.txt", "r")) != 0)/*打开文件,并判断*/
	
		printf("\\ncan not open the file!\\n");	 /*若打不开,提示*/
		exit(1);								 /*退出程序*/
	
	while (!feof(fp))							 /*从头到尾读文件*/
	
		fscanf_s(fp, "%s", string, 200 * sizeof(char));	/*把文件中字符串放到数组里*/
		for (i = 0; i < strlen(string); i++)	 /*遍历字符串*/
		
			if (string[i]<'a' || string[i]>'z')	 /*若非a~z*/
			
				continue;					     /*不记录*/
			
			letter[string[i] - 'a']++;		     /*记录a~z出现的次数*/
		
			
	fclose(fp);								     /*关闭文件*/
	for (i = 0; i < 26; i++)				     /*输出记录*/
	
		printf("%d ", letter[i]);
	
	printf("\\n");

	return 0;

文件data.txt内容:

如果你用的是dev c++,按下面这样写

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)

	char string[200];							/*string数组存放字符串*/
	int letter[26] =  0 ;						/*letter数组记录字母出现的次数*/
	unsigned int i;							
	FILE *fp;
	fp = fopen("data.txt", "r");
	/*打开文件,并判断*/
	if (fp == NULL) 
		printf("\\ncan not open the file!\\n");	 /*若打不开,提示*/
		exit(1);								 /*退出程序*/
	
	while (!feof(fp))							 /*从头到尾读文件*/
	
		fscanf(fp, "%s", string, 200 * sizeof(char));	/*把文件中字符串放到数组里*/
		for (i = 0; i < strlen(string); i++)	 /*遍历字符串*/
		
			if (string[i]<'a' || string[i]>'z')	 /*若非a~z*/
			
				continue;					     /*不记录*/
			
			letter[string[i] - 'a']++;		     /*记录a~z出现的次数*/
		
			
	fclose(fp);								     /*关闭文件*/
	for (i = 0; i < 26; i++)				     /*输出记录*/
	
		printf("%d ", letter[i]);
	
	printf("\\n");

	return 0;

以上是关于C语言,统计文件中的字符个数的主要内容,如果未能解决你的问题,请参考以下文章

C语言:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开

C语言中字符统计问题

统计字母个数(C语言)

c语言:输入一行字符,统计其中的单词个数,单词之间用空格分开

统计字母个数(C语言)

C语言:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开