Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 7 years ago

求此題C語言程式解答

題目如下:

請寫一段程式,其可對一部電腦的儲存設備內所儲存之所有文字檔案(text file)進行關鍵字搜尋(keywords search)。(40 分)

(一)可以接受使用者輸入中文、英文或中英夾雜之關鍵字進行搜尋。

(二)須將所搜尋到之檔案名稱(file name)及包含該關鍵字前、後幾個字之段落(segment),記錄起來。

(三)須能統計並顯示出總共搜尋到多少檔案、多少段落。

求大大解答

8 Answers

Rating
  • sponge
    Lv 6
    7 years ago
    Favorite Answer

    請參考:

    此程式能從指定目錄下首層所有 .txt 檔案裡搜尋

    #include <dirent.h>

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    #ifndef max

    # define max(a, b) ((a)<(b) ? (b) : (a))

    #endif

    #ifndef min

    # define min(a, b) ((a)<(b) ? (a) : (b))

    #endif

    // 計算幾個檔案和幾個段落

    static int count[2] = {0};

    void searchcwd(const char *keyword)

    {

    DIR *dir = opendir("."); // 打開目前目錄

    if (dir) { // 成功開啟

    struct dirent *p = NULL;

    // 逐一讀本目錄所有項目,可能為子目錄或檔案

    while ((p=readdir(dir))!=NULL) {

    size_t l = strlen(p->d_name);

    // 副檔名是 .txt

    if (l>4 && !strcmp(&p->d_name[l-4], ".txt")) {

    // 開檔看看,非子目錄且有權限就能開

    FILE *file = fopen(p->d_name, "rb");

    if (file) { // 開檔成功

    int found = 0;

    char *buffer = NULL, *pos;

    // 以下五行將整個文字檔讀入

    fseek(file, 0, SEEK_END);

    l = ftell(file);

    rewind(file);

    buffer = (char*)malloc(l+1);

    fread(buffer, sizeof(*buffer), l+1, file);

    // 讓 buffer 本身成為合法 C 字串

    buffer[l] = '\0';

    pos=buffer;

    // 關鍵字搜尋,以 strstr 做字串搜尋

    for (; (pos=strstr(pos, keyword)); pos++) {

    // 不越界下圈出前後 10 字元段落

    char *q = max(pos-10, buffer), *r = min(pos+10, buffer+l);

    // 第一次找到,印一下檔名

    if (!found) {

    printf("%s:\n", p->d_name);

    count[0]++; // 檔案計數增加

    found = 1;

    }

    // 印出段落

    while (q<r) putchar(*q++);

    putchar('\n');

    count[1]++; // 段落計數增加

    }

    free(buffer);

    fclose(file);

    }

    }

    }

    closedir(dir);

    }

    }

    int main(int argc, char *argv[])

    {

    chdir(argv[2]); // 跳到指定目錄

    searchcwd(argv[1]);

    printf("%d file(s), %d segment(s)\n", count[0], count[1]);

    return 0;

    }

    執行方式為 a.exe my_keyword TextFileDir

    my_keyword 是關鍵字,TextFileDir 是目錄

    若段落間含有 \n, 輸出也許不合您預期

    因此可以嘗試改以 "rt" 開檔,fgets 來進行讀檔

    也可以嘗試改寫成連子目錄都能搜索,有如 Linux 指令 grep

    希望以上回答對您有幫助!

  • Anonymous
    7 years ago

    下面的網址應該對你有幫助

    http://phi008780426.pixnet.net/blog

  • Anonymous
    7 years ago

    下面的網址應該對你有幫助

    http://phi008780426.pixnet.net/blog

  • 7 years ago

    下面的網址應該對你有幫助

    http://phi008780426.pixnet.net/blog

  • How do you think about the answers? You can sign in to vote the answer.
  • 7 years ago

    下面的網址應該對你有幫助

    http://phi008780426.pixnet.net/blog

  • 7 years ago

    下面的網址應該對你有幫助

    http://phi008780424.pixnet.net/blog

  • 7 years ago

    下面的網址應該對你有幫助

    http://phi008780424.pixnet.net/blog

  • Anonymous
    7 years ago

    下面的網址能回答你的問題

    http://phi008780414.pixnet.net/blog

Still have questions? Get your answers by asking now.