プログラミング言語 C
文字の入出力全般について、
・ テキストの入力あるいは出力は、それがどこで発生したか あるいはどこに出力するかにはよらずに*1、文字のストリーム(流れ)として扱われる。
・ テキストストリームとは 行ごとに分割された 文字の連なり*2である。各行は ゼロまたはそれ以上の個数の文字列の最後に 改行記号がついた形をとる。(p19)
↑fgets() や fputs() のことですネ。
・ 標準ライブラリには 一度に1つの文字を読み書きする関数が用意されている。(←getchar() や putchar() のこと)
・ getchar() と putchar() があれば、(標準)入出力について それ以外 何も知らなくても、役に立つプログラムを かなりたくさん書くことができる。(p19)
つぎは getchar() の返り値が なぜ int型 なのか、
・ キーボードや画面上で文字として扱われるものは 他のすべてのデータと同じく、内部的には 単にビットパターンとして格納される。
・ 文字データの格納には 特に char型が設けられているが、任意の整数型も使える。この int型を (getchar で使うのには) 微妙だが重要な理由がある。
・ getchar() が返す任意の値*3を保持するためには、十分大きなデータ型で宣言しなければならない。
・ それには 任意の char(文字) に加えて、入力の終りを示す EOF*4も保持するに 十分な大きさでなければならないから、char型(←1バイト)では不可能なので、int型を使うのである。(p20)
- main()
- {
- int c; /* 返り値は int型 */
- while ((c = getchar()) != EOF) {
- putchat();
- }
- }
・ このプログラムでは 文字を一つとって c に代入した後、その文字が ファイルの終わりかどうか while で調べている。
・ EOF でなければ while の構成文が実行され 文字がプリントされる。同様に while が繰り返され、入力の終わりにくると while は終了し、したがって main() も終了する。
・ 上のプログラムでは 入力を1つの行にまとめている - getchar() の呼出しが 1箇所だけ - から 短くなっている。
・ できたプログラムは より簡潔になり、この慣用句をマスターしてしまえば 読みやすくもなる。
・ ただし 使いすぎると 逆に わかりにくいプログラムになってしまうので 注意。(p21)