C语言 文件单词的检索与计数

1.设计要求与分析

建立一个文本文件,每个单词不包含空行且不跨行。检索单词的出现的行数,与位置。

2.具体设计

2.1建立文本文件

2.1.1定义一个串变量

typedef struct{
	char cACh[MAXSIZE];
	int	 iLenght;
}SEQSTR;

这是一个顺序串

void fileCreate ( )
{
	int i;
	SEQSTR STR;
	char cFileName[30],cContinueFlg;
	FILE *fp;
	printf("输入要建立的文件名:");
	scanf("%s",cFileName);
	fp = fopen(cFileName,"w");
	cContinueFlg = 'n';
	while (cContinueFlg == 'n'||cContinueFlg == 'N') {
		printf("输入一行文本 \n");
		getchar();
		gets(STR.cACh);
		strcat(STR.cACh,"\n");
		STR.iLenght=strlen(STR.cACh);
		for (i = 0; i < STR.iLenght; i++) {
			fwrite(&STR.cACh[i],sizeof(char),1,fp);
		}	
		printf("结束吗?y or n:");
		cContinueFlg=getchar();
	}
	fclose(fp);
	printf("建立文件结束!\n");
}

1.输入文件名,打开该文件

2.循环读入到该文件过程如下

While(不是文件的输入结束){

读入一文本进入串变量;

串变量写入文件;

输入是否为结束的标志;

}

2.2检索单词的出现的位置

2.2.1串的匹配算法

从主串(顺序存储结构)的第k个字符起首次与匹配串相同的起始位置。

int stringMatch ( SEQSTR STRMaster, SEQSTR STRMatch, int iInitPos) {
	int iMaster,iMatch;
	iMaster = iInitPos - 1;
	iMatch = 0;
	while (iMaster < STRMaster.iLenght && iMatch < STRMatch.iLenght) {
		if (STRMaster.cACh[iMaster] == STRMatch.cACh[iMatch]) {
			iMaster++;
			iMatch++;
		}
		else {
			iMaster = iMaster - iMatch +1;
			iMatch = 0;
		}
	}
	if (iMatch >= STRMatch.iLenght)
		return iMaster+1-STRMatch.iLenght;
	else
		return -1;
}

iMaster,iMatch;是扫描的变量,在未完成主串与匹配串的扫描时,当出现相同的字符时两者都会自加,一旦发现不同的立马回到主串的起始位置的下一个的位置,匹配串的扫描变量立马清零。扫描完了,返回主串存在匹配串的起始位置。

2.2.2单词的检索

1.输入要检索的文件名,并打开

2.输入要检索的单词

3.行计数器清0

4.While(不是文件的结尾) {

读入一行到指定的主串中;

求出串的长度;

行单词计数器置0;

检索的位置置1为初始的位置;

While(初始化检索的位置<主串的长度) {

调用串匹配函数,得到位置;

有的话,单词计数器+1,在这串中先保留起来它的位置;

接着下一个的检索;

}

检索完这行,如果有单词,就输出;

}

void wordRetrieval() {
	FILE *fp;
	SEQSTR STRMaster,STRSlave;
	char cAFileName[30];
	int i,j,k,l,m;
	int iASiteStore[20];
	printf("输入的文件名:");
	scanf("%s",cAFileName);
	fp = fopen(cAFileName,"r");
	printf("输入要搜索的单词:");
	scanf("%s",STRSlave.cACh);
	STRSlave.iLenght=strlen(STRSlave.cACh);
	l=0;
	while (0==feof(fp)) {

		fgets(STRMaster.cACh,sizeof(STRMaster.cACh),fp);//文件读一个字符串
		STRMaster.iLenght=strlen(STRMaster.cACh);
 		if (feof(fp))
 			break;
		l++;
		k=1;
		i=0;
		while (k < STRMaster.iLenght) {
			j = stringMatch(STRMaster,STRSlave,k);
			if (j < 0)
				break;
			else {
				i++;
				iASiteStore[i] = j;
				k = j + STRSlave.iLenght;
			}
		}
		if (i > 0) {
			printf("行号:%d次数:%d,位置分别是:",l,i);
			for ( m = 1; m <= i; m++)
				printf("%4d",iASiteStore[m]);
			printf("\n");
		}
		else
			printf("没找到");
	}
}


整个源代码

// wordRetrieval.cpp : Defines the entry point for the console application.
//

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MAXSIZE 256
typedef struct{
	char cACh[MAXSIZE];
	int	 iLenght;
}SEQSTR;

typedef SEQSTR *qSEQSTR;

int stringMatch ( SEQSTR STRMaster, SEQSTR STRMatch, int iInitPos) {
	int iMaster,iMatch;
	iMaster = iInitPos - 1;
	iMatch = 0;
	while (iMaster < STRMaster.iLenght && iMatch < STRMatch.iLenght) {
		if (STRMaster.cACh[iMaster] == STRMatch.cACh[iMatch]) {
			iMaster++;
			iMatch++;
		}
		else {
			iMaster = iMaster - iMatch +1;
			iMatch = 0;
		}
	}
	if (iMatch >= STRMatch.iLenght)
		return iMaster+1-STRMatch.iLenght;
	else
		return -1;
}

void fileCreate ( )
{
	int i;
	SEQSTR STR;
	char cFileName[30],cContinueFlg;
	FILE *fp;
	printf("输入要建立的文件名:");
	scanf("%s",cFileName);
	fp = fopen(cFileName,"w");
	cContinueFlg = 'n';
	while (cContinueFlg == 'n'||cContinueFlg == 'N') {
		printf("输入一行文本 \n");
		getchar();
		gets(STR.cACh);
		strcat(STR.cACh,"\n");
		STR.iLenght=strlen(STR.cACh);
		for (i = 0; i < STR.iLenght; i++) {
			fwrite(&STR.cACh[i],sizeof(char),1,fp);
		}	
		printf("结束吗?y or n:");
		cContinueFlg=getchar();
	}
	fclose(fp);
	printf("建立文件结束!\n");
}

void wordRetrieval() {
	FILE *fp;
	SEQSTR STRMaster,STRSlave;
	char cAFileName[30];
	int i,j,k,l,m;
	int iASiteStore[20];
	printf("输入的文件名:");
	scanf("%s",cAFileName);
	fp = fopen(cAFileName,"r");
	printf("输入要搜索的单词:");
	scanf("%s",STRSlave.cACh);
	STRSlave.iLenght=strlen(STRSlave.cACh);
	l=0;
	while (0==feof(fp)) {

		fgets(STRMaster.cACh,sizeof(STRMaster.cACh),fp);//文件读一个字符串
		STRMaster.iLenght=strlen(STRMaster.cACh);
 		if (feof(fp))
 			break;
		l++;
		k=1;
		i=0;
		while (k < STRMaster.iLenght) {
			j = stringMatch(STRMaster,STRSlave,k);
			if (j < 0)
				break;
			else {
				i++;
				iASiteStore[i] = j;
				k = j + STRSlave.iLenght;
			}
		}
		if (i > 0) {
			printf("行号:%d次数:%d,位置分别是:",l,i);
			for ( m = 1; m <= i; m++)
				printf("%4d",iASiteStore[m]);
			printf("\n");
		}
		else
			printf("没找到");
	}
}

int main(int argc, char* argv[])
{
	int iChoose;
	//printf("Hello World!\n");
	while(1) {
		scanf("%d",&iChoose);
		switch (iChoose) {
		case 1:fileCreate();break;
		case 2:wordRetrieval();break;
		}
	}
	return 0;
}

如何使用

1.vs2017创建C++控制台程序,复制源码。

2.因为VS2017默认使用更加安全的fopen_s函数,若要继续使用fopen,需要在 项目->属性->C/C+±>SDL检查 中设置为否

新建D盘test.txt,内容为

hello word
hello word
hello word
hello word
hello word
hello word

运行程序

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四夕立羽

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值