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语言:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开