/* File 入力 [Text File 表示] 1-11.c */ #include <stdio.h> #include <stdlib.h> /* stdlibは、standard library (標準 書庫)の意。標準入出力に使う命令や関数はstdio.hに 納まっているが、それ以外によく使われるものがこのstdlib.hに定義してある。 下で使うexit(抜ける、出る)もその一つである。 */ #define MAX 127 /* define(=定義する)は、左の文字列を右の文字列で置換する命令。前に#を付け、最後に ;は付けない。ここでは MAXを127としたので、main()でMAXと書くと127と書いたのと同じ事 になる(MAXは全て 127に置き換わる)。このdefineの様な命令を、「前以って処理する」とい う意味でpre-processorという。programのあちこちで同じ値を使うのであれば、defineで決め れば分かり易いし、値を変更する場合も簡単である。配列要素数の指定にはdefineが良く使わ れる。 */ main() { char fname[50]; char str[MAX+1]; /* fnameに入力file名を納める。file名の長さが不明なので、要素数を多目にしておく。 strには、fileから読み込んだ文字列を納める。MAXはその strに読み込む文字数の最大値。 読み込むtext一行の文字数がこれ以上ならば、一旦切って次で取り込むので適当でいいが、 長めにしておくのが普通。 */ FILE *fin; // fileを扱う宣言 /* fileとの入出力は、用意した受け皿変数とfileとの間で直接行われるのではない。別に窓口を 指定しなければならない。ここでは、その窓口の名をfile input(file 入力) の意味で finとし た。勿論何でも構わない。窓口名の前には'*'を付ける。 同時に幾つものfileを扱う場合は、窓口がfileの数だけ要るので、宣言もそれだけ必要。 */ printf("* Text File 表示 *\nFile名を入力:"); gets(fname); fin=fopen(fname,"r"); /* file入出力を行う前には指定窓口を開け、終わったら閉めなければならない。fopen (file open)で開ける。()中の"r"はread, 即ち finを読み込み専用に使う意。"w"と書けば write, 書き 込みに使う事を示す。"r"と書いておけば、読み込む積もりのfileにうっかり書き込んだりする事 を防げる。 */ if (fin==NULL) {printf("File がありません!\n\nEnd\n"); exit(1);} /* 入力したfile名が間違っていれば当然エラーになるので、その時fileが無いことを表示して programを抜ける。抜ける為にはexit();という命令を使う。勿論、printf文は無くても良いが、 何故programが終了したのかを示す方が良い。正常終了の場合には'0'を返すようにしているので (return 0;)、エラーである事を明示する為 exit(1); として'1'を返すようにしている。exitを 使うには、stdlib.h が要る。 指定窓口に何も入らない時(無=NULL)を入力間違いと判定。 */ fgets(str,MAX,fin); /* fgets();が、窓口を通してfileから文字列を読み込む命令。file get string である。file 入出力に関する命令には、頭にfileを意味する fが付く。()の中には(文字列を納める変数名, そこに何文字入れるか, どこが窓口か)を書く。順番に注意。この辺がC言語のしつこい所である。 fgets(str)だけで良さそうなものだが、同時に窓口を幾つも開けられるので指定が要る。読み込む 文字数にしても、違うfileからは違う読み方をするかも知れない。…と言う訳で fgets(str,MAX,fin);としつこく書く。 */ while ( ! feof(fin)) { fputs (str,stdout); // 文字列の表示 /* printf("%s",str); // 当然これでも構わない */ fgets(str,MAX,fin); // 次の文字列をfileから読み込む } /* feof は file 終端を示す。file eof[=end of file] の意。eofが file以外(Key Board入力 の最後とか…)にも終了を示す値として使われるので、頭にfを付けて別にしている。その feofの 前に否定を意味する'!'を付けているので、file が終端ではない(中身がある)間、loopを回る 事になる。feof()は、どのfileに付いてであるかを示すため( )内に窓口の名を書く。 fileの終端が分かると色々な処理が楽になるので、このfeof()は便利である。 読み込んだtextは strに納まるので、それをfputs();で出力する。fputs [=file put string] は、fileに文字列を置く意。一体どのfileに。stdoutにである。これは standard outputであり、 標準出力の場を意味する。通常は画面に出力するので、画面上にtext fileから読み込んだ文字が 表示される事になる。ここは printf();でも可 。 そして、再び文字列を読み込み、判定と表示を繰り返す。 */ fclose(fin); /* 終わったら用済みのfileを閉じる(file close)。開けたfileは必ず閉じねばならない。fopen と異なり、単に窓口だけ書いて fclose(fin);とする。*/ printf("\nEnd\n"); return 0; }