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

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

1画面分表示して停止し、リターンキーを押すと次の1画面分を表示する。[pro2-5.c]

 カウントした行数が1画面の(行数 - 1)と一致したら停止するようif文で判定する処理を追加する。
 表示を停止するためには、関数gets()などで入力待ちにする。

 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:
#include <stdio.h>
#include <stdlib.h>

#define STR_MAX 256
#define SCREEN_LINE 23  /* 1画面分の行数 */

int main(void)
{
    FILE *fp;            /* ファイルポインタ用 */
    char fname[80];      /* ファイル名用 */
    char buff[STR_MAX];  /* 文字列用 */
    char key[STR_MAX];   /* キー入力文字列用 */
    int line = 0;        /* 行数カウント用 */

    printf("ファイル名 : ");    /* プロンプト表示 */
    gets(fname);              /* ファイル名入力 */

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

    while(fgets(buff, STR_MAX, fp) != NULL){
        ++line;    /* 行数カウント */
        printf("%s", buff);
        if(line == SCREEN_LINE){   /* 23行になったとき */
            printf("--- more ---");
            gets(key);      /* 入力待ち */
            line = 0;       /* 行数カウントを0に設定 */
        }
    }

    fclose(fp);    /* ファイルクローズ */
    return(0);
}




各行の先頭にその行の文字数を表示する。[pro2-6.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:
#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];  /* 文字列用 */
    int length;          /* 文字列長用 */

    printf("ファイル名 : ");    /* プロンプト表示 */
    gets(fname);              /* ファイル名入力 */

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

    while(fgets(buff, STR_MAX, fp) != NULL){
        length = strlen(buff);            /* 文字列計算 */
        printf("%d %s", length, buff);    /* 表示 */
    }

    fclose(fp);    /* ファイルクローズ */
    return(0);
}
実行結果

ファイル名 : pro1-1.c
19 #include <stdio.h>
15 int main(void)
2 {

29 printf("%c(%X) ", c, c);
15 return(0);
2 }


[考察]
 各行の文字数が1つずつ多く表示されるはずである。なぜ、そのようになるか考えよ。

 わからなければ22行目で1行読み込んだ後に関数test_pointerを挿入して実行してみよう。 このプログラムでは、文字列用のポインタ変数を使用していないので、次のように書く。

    test_pointer(buff, NULL);





【練習問題2-13】 pro2-6.cのプログラムを文字数が正しく表示されるように修正しなさい。

 ヒント:各行の文字数が1ずつ多いのだから・・・・・

 




【練習問題2-14】 【練習問題2-13】にファイル全体の文字数を表示する処理を追加しなさい。

ヒント:各行の文字数をすべて加算すれば全体の文字数が得られる。

実行結果

ファイル名 : pro1-1.c
18 #include <stdio.h>
14 void main(void)

1 }
ファイル全体の文字数=130

 



【練習問題2-15】 【練習問題2-14】を全体の行数と文字数だけ表示するように変更しなさい。

実行結果

ファイル名 : pro1-1.c
ファイル全体の行数=10 文字数=130

ヒント:各行の表示をしないようにする。行数をカウントする処理を追加する。

 


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

 

 

inserted by FC2 system