「C言語練習」 1-11.c   ・前へ   ・次へ
/* 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;
}


(前に戻る)   ・次へ