C言語-ファイル処理
前へ 目次へ 次へ 

2.1 テキストファイルの読み込み (4)

指定した文字列を含む行を表示する。[pro2-7.c]

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STR_MAX 256

int main(void)
{
    FILE *fp;
    char fname[80];
    char buff[STR_MAX];
    char srch[STR_MAX];

    printf("ファイル名 : ");
    gets(fname);
    printf("検索文字列 : ");
    gets(srch);

    if((fp = fopen(fname, "r")) == NULL){
        printf("ファイルがオープンできません\n");
        exit(1);
    }

    while(fgets(buff, STR_MAX, fp) != NULL)
        if(strstr(buff, srch) != NULL)    /* 検索 */
            printf("%s", buff);

    fclose(fp);
    return(0);
}
実行結果

ファイル名 : pro1-1.c
検索文字列 : printf
printf("文字列 = ");
printf("%c(%X) ", c, c);





【練習問題2-16】 pro2-7.cに指定した文字列を含む行数を表示する処理を追加しなさい。

実行結果

ファイル名 : pro1-1.c
検索文字列 : printf
printf("文字列 = ");
printf("%c(%X) ", c, c);
2行ありました


 



指定した文字列を検索し、その個数を表示する。[pro2-8.c]

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STR_MAX 256

int main(void)
{
    FILE *fp;
    char fname[80];
    char buff[STR_MAX], srch[STR_MAX];
    char *sstart;    /* 検索開始アドレス用 */
    int count = 0;   /* カウント用 */

    printf("ファイル名 : ");
    gets(fname);
    printf("検索文字列 : ");
    gets(srch);

    if((fp = fopen(fname, "r")) == NULL){
        printf("ファイルがオープンできません\n");
        exit(1);
    }

    while(fgets(buff, STR_MAX, fp) != NULL){
        sstart = buff;       /* 検索開始アドレス設定 */
        while(1){
            sstart = strstr(sstart, srch);
            if(sstart != NULL){
                ++count;      /* ↓検索開始アドレス再設定 */
                sstart = sstart + strlen(srch);  /* ←訂正 */
                if(*sstart == '\0')
                    break;
            }else
                break;
        }
    }
    printf("発見した文字列の個数=%d\n", count);

    fclose(fp);
    return(0);
}
実行結果

ファイル名 : pro2-8.c
検索文字列 : sstart
発見した文字列の個数=8

 実行例のようにsstartはpro2-8.cの12, 26, 29, 32行目にそれぞれ1つ、28, 31行目にそれぞれ2つある。28, 31行目では、1つ目の sstart が見つかった後、31行目で検索開始位置を計算し、再度、検索を行っている。これにより、1行に検索文字列が複数あっても正しく検索される。



前へ 目次へ 次へ 
Copyright © 2001-2003 Hiroshi Masuda 

 

 

inserted by FC2 system