數據結構課程設計實驗七:文本文件單詞的檢索及計數

要求編程建立一個文本文件,每個單詞不包括空格及跨行,單詞由字符序列構成且區分大小寫,完成以下功能:統計給定單詞在文本文件中出現的總次數、檢索輸出某單詞在文本文件中首次出現的行號及位置。


 

出現的問題:當選定單詞是某一行最後一個單詞時,記錄行數的計數器會多記錄一次行數.

編程環境是codeblocks,編譯器是GUN-GCC,操作系統是win7-64


 

#include<stdio.h>
#include <stdlib.h>
char* Newfile();
int Index();

char* Newfile()//建立一個新的文本文檔,並將輸入內容寫入文本中
{
    FILE *fp;
    char ch,filename[10];
    printf("請輸入文件名:(包括拓展名)\n");
    scanf("%s",filename);
    fp=fopen(filename,"w+");
    ch=getchar();
    printf("請輸入單詞:(請以$符號結束)\n");
    while(ch!='$')
    {
        ch=getchar();
        fputc(ch,fp);
     }
    fclose(fp);
    return filename;
}

int Index(char* p)//樸素模式匹配算法
{
    FILE *fp;
    if((fp=fopen(p,"r"))==NULL)
    {

        printf("找不到文件\n");
        exit(0);
    }
    //將文件讀取到一維數組當中
    char S[100],T[20];
    char ch1,ch2;

    ch1=fgetc(fp);
    int i=0;//i用於記錄主串的長度

    while(ch1!='$')
    {
        S[i]=ch1;
        ch1=fgetc(fp);
        i++;
    }
    S[i]='$';

    //建立子串
    printf("請輸入你選擇的單詞:\n");
    ch2=getchar();
    ch2=getchar();
    int j=0;//j用於記錄輸入的子串的長度
    while(ch2!='\n')
    {
        T[j]=ch2;
        ch2=getchar();

        j++;
    }
    //樸素模式匹配算法實現
    int row,col;//row爲列,col爲行
    row=1;
    col=1;
    int m,n,q;//m爲S的下標,n爲T的下標,q用於換行時記錄m的值
    m=0;
    n=0;
    q=1;
    int num=0;//num用於記錄選定單詞出現的次數
    while(m< jbr>    {

        if(S[m]==T[n])
        {
            m++;
            n++;
        }
        else
        {
            m=m-n+1;
            n=0;

        };

        if(n==j)
        {
            num++;
            if(col==1)
            {
                row=m-n+1;
                printf("第%d個單詞出現的位置是第%d行第%d個\n",num,col,row);
            }
            else
            {
                row=m-n-q;
                printf("第%d個單詞出現的位置是第%d行第%d個\n",num,col,row);
            }


        }
        if(S[m]=='\n')
        {
            col++;
            q=m;
        };


        if(S[m]=='$')
            {
                printf("所選單詞出現的次數是%d\n",num);
            }
    }

 


}

int main()
{
    char *p;//p用於記錄和傳遞傳遞用戶輸入的文件名
    p=Newfile();
    Index(p);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章