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

2 ファイル処理

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

ファイルを使用するプログラムでは、次の手順でプログラミングしていく。ファイルを使用する場合はいつも同じである。

  1. ファイルをオープンする。[fopen]
  2. 具体的な処理(ファイルの読み書き)
  3. ファイルをクローズする。[fclose]


テキストファイルの内容を表示する。(関数fgetc版)[pro2-1.c]

 MS-DOSのTYPEやUNIXのcatのようにテキストファイルの内容を表示するツールを作成する。ファイルからの読み込みには、1文字読み込み関数fgetcを使用する。

 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>

int main(void)
{
    FILE *fp;          /* ファイルポインタ用 */
    char fname[80];    /* ファイル名用 */
    char ch;           /* 文字入力用 */

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

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

    while(1){        /* 永久ループ */
        ch = fgetc(fp);    /* ファイルfpから1文字読み込み */
        if(ch == EOF){     /* 読み込み終了 */
            break;         /* ループ脱出 */
        }
        putchar(ch);       /* 1文字表示 */
    }

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

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

    printf("文字 = ");
    c = getchar();
    printf("%c(%X) ", c, c);
    return(0);
}

 13〜17行目は、C言語では制御文の中で代入することができるので、一般的には次のように記述する。

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

※赤色部分の処理後、NULLと比較される。

 19〜25行目も同様で、whileも制御文であるので、一般的には次のように記述する。

while((ch = fgetc(fp)) != EOF){ putchar(ch); }

※赤色部分の処理後、EOFと比較される。 24行目のputchar(ch); では、改行を指示する文字\nがないのに、実行すると1行ずつ改行されて表示される。これは、関数fgetc()がテキストファイル中の改行文字も1文字として読み込むからである。


【練習問題2-9】 pro2-1.cのプログラムを一般的な記述に変更しなさい。

 


テキストファイルの内容を表示する。(関数fgets版)[pro2-2.c]

 MS-DOSのTYPEやUNIXのcatのようにテキストファイルの内容を表示するツールを作成する。ファイルからの読み込みには、1行読み込み関数fgets()を使用する。

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

#define STR_MAX 256 /* 文字列入力用配列長 */

int main(void)
{
    FILE *fp;          /* ファイルポインタ用 */
    char fname[80];    /* ファイル名用 */
    char buff[STR_MAX], *pp;    /* 文字列用 */

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

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

    while(1){    /* 永久ループ */
    pp = fgets(buff, STR_MAX, fp);    /* 1行読み込み */
        if(pp == NULL){    /* 読み込み終了 */
            break;           /* ループ脱出 */
        }
        printf("%s", buff);    /* 1行表示 */
    }

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

 15〜19行目は、C言語では制御文の中で代入することができるので、一般的には次のように記述する。

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

 21〜27行目も同様で、whileも制御文であるので、、一般的には次のように記述する。

while(fgets(buff, STR_MAX, fp) != NULL){
    printf("%s", buff);
}

 26行目のprintf("%s", buff); では改行を指示する文字\nがないのに、実行すると1行ずつ改行されて表示される。これは、関数fgets()がテキストファイル中の改行文字も読み込むからである。

fig



【練習問題2-10】 pro2-2.cのプログラムを一般的な記述に変更しなさい。
 

以後は、1行読み込み(fgets)を利用してプログラミングしていく。


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

 

 

inserted by FC2 system