文本文件单词的检索与计数(代码实现)

#include
using namespace std;
struct danci
{
char s[20]; //单词
int colum; //所在行号
int n; //第n个单词
struct danci* next;
};
struct danci* read(struct danci* head); //建立一个单词链表
void chaxun1(struct danci* head, char* str); //求单词出现的总次数
void chaxun2(struct danci* head, char* str); //求单词第一次出现所在的行号及位置
int equal(char* s1, char* s2); //字符串匹配
int main()
{

struct danci* p = NULL;
p = read(p);
printf("请输入查询的单词:");
char str[30];
cin >> str;
chaxun1(p, str);
chaxun2(p, str);
return 0;

}
struct danci* read(struct danci* head)
{
FILE* fp;
if (fopen_s(&fp, “1.txt”, “r”) != NULL)//访问文本就在这
{
printf(“无法打开此文件\n”);
exit(0);
}
struct danci* p, * q;
p = (struct danci*)malloc(sizeof(struct danci));
head = q = p;
char ch;
int col = 1;
int count = 1;
int i = 0;
ch = fgetc(fp);//文件夹里读取文件
while (ch != EOF) //从文件读取字符
{

    if (ch == '\n')   //当遇到‘.’或‘,’的下一字符为换行符
    {
        ch = fgetc(fp);
        count = 1;
        col += 1;                            //行数加一,个数重置一
        continue;
    }
    while (ch != ' ' && ch != ',' && ch != '.' && ch != '\n' && ch != EOF)
    {
        p->s[i] = ch;
        i++;
        ch = fgetc(fp);
    }
    p->s[i] = '\0';                          //加结束标志
    i = 0;
    p->colum = col;
    p->n = count;
    if (ch == ' ' || ch == ',' || ch == '.')
    {
        count += 1;                         //个数加一
    }
    if (ch == '\n')
    {
        count = 1;
        col += 1;                           //行数加一,个数重置一
    }
    if (ch == EOF)
    {
        break;
    }
    q = p;
    p = (struct danci*)malloc(sizeof(struct danci));
    q->next = p;
    ch = fgetc(fp);
}
q->next = NULL;
return head;

}

void chaxun1(struct danci* head, char* str)
{
int total = 0;
while (head != NULL)
{
if (equal(head->s, str))
total += 1;
head = head->next;
} //遍历整个链表
printf("%s 一共出现 %d 次\n", str, total);
}

void chaxun2(struct danci* head, char* str)
{
int flag = 0;
while (head != NULL)
{
if (equal(head->s, str))
{
flag = 1;

    }
    if (flag) {
        printf("该单词:%s 出现的位置第%d行第%d个单词\n", str, head->colum, head->n);
        flag = 0;
    }
    head = head->next;

}                        //遍历整个链表

}

int equal(char* s1, char* s2)
{
int i, l1, l2;
l1 = strlen(s1);
l2 = strlen(s2);
if (l1 != l2)
return 0;
for (i = 0; i < l1; i++)
{
if (s1[i] != s2[i])
return 0;
}
return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值