C语⾔实现⽂本⽂件的检索及计数
⽂本⽂件检索及计数2
题⽬要求:要求编程建⽴⼀个⽂本⽂件,每个单词不包括空格及跨⾏,单词由字符序列构成且区分⼤⼩写,完成以下功能:统计给定单词在⽂本⽂件中出现的总次数、检索输出某单词在⽂本⽂件中⾸次出现的⾏号及位置。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void creat(FILE* fp)
{
char ch[1000];
//输⼊⽂本内容
printf("Enter the contents of this file, end with # in the start of a line.\n");
fgets(ch,1000,stdin);//从标准输⼊流中读取⼀⾏
//⾏⾸不为#时,将本⾏内容写⼊⽂件
while(ch[0]!='#')
{
fputs(ch, fp);
fgets(ch,1000,stdin);
}
}
void find(FILE* fp,char word[])
{
int first_row, first_col;//单词第⼀次出现的位置
int index =0, row =0, col =0,count =0;//依次为当前单词下标变量,⾏号,列号,指定单词出现次数
char ch[1000], this_word[50];//当前⾏内容,当前单词
char this_char;//当前字符
//按⾏读取
while(fgets(ch,1000, fp)!=NULL)
{
row ++;
col =0;
//依次将本⾏字符赋给this_char
isalpha 函数for(int i =0; i<strlen(ch); i ++)
{
this_char=ch[i];
//当前字符为字母时,将其存⼊当前单词数组
if(isalpha(this_char))
{
this_word[index]=this_char;
index++;
}
else
{
if(index !=0)//单词结束
{
col++;
}
this_word[index]='\0';//表⽰字符串的结束,这样就只显⽰index前⾯我们想要的字符,否则将显⽰全部的this_word[50],但后⾯的不是我们想要的 index =0;//以备下⼀个单词的开始
//当前单词为要查单词
if(strcmp(this_word , word)==0)
{
count++;
//次数为1时,记录第⼀次出现的⾏号和列号
if(count ==1)
{
first_col = col;
first_row = row;
}
}
}
}
}
printf("\n\nThe word you enter appears %d time(s) in total.\n",count);
if(count >=1)
{
printf("\nThis word first appears in line %d, column %d",first_row,first_col);
}
}
int main()
{
FILE* fp;
char word[50];
fp=fopen("","w+");
if(fp ==NULL)
{
printf("Unable to open this file.");
exit(0);//正常运⾏程序并退出程序
}
creat(fp);
//输⼊要查的单词
printf("\nEnter the word you want to find:\n");
scanf("%s", word);
//将⽂件指针重新指向开头
rewind(fp);
//查单词
find(fp, word);
fclose(fp);
return0;
}
关于程序中使⽤到的⼏个函数:
1.fgets()函数:从指定⽂件中读取字符串,每次读取⼀⾏。
原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取⼀⾏,并把它存储在 str 所指向的字符串内。当读取 (n-1)个字符时,或者读取到换⾏符时,或者到达⽂件末尾时,它会停⽌。此函数会⾃动在末尾加‘\0’表⽰字符串结束。
2.fputs()函数:向指定的⽂件写⼊⼀个字符串(不⾃动写⼊字符串结束标记符‘\0’)。成功写⼊⼀个字符串后,⽂件的位置指针会⾃动后移,函数返回值为⾮负整数;否则返回EOF(符号常量,其值为-1)。
3.isalpha()函数:判断字符是否为字母,若为字母返回⾮0.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论