C言語-ファイル処理 |
2.1 テキストファイルの読み込み
ファイルを使用するプログラムでは、次の手順でプログラミングしていく。ファイルを使用する場合はいつも同じである。
テキストファイルの内容を表示する。(関数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 |
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()がテキストファイル中の改行文字も読み込むからである。
以後は、1行読み込み(fgets)を利用してプログラミングしていく。
Copyright © 2001 Hiroshi Masuda |