はじめての C

C programming note*1
複数の 関数に 分けるというのは、よく使われる - 基本になる - 処理を 切り離して 別の関数に したてておく。 それを main() 関数で 呼び出す、ということ。
cat1 を 改良した プログラムでは 2つの 関数が 使われている。

do_one() は、ファイル 1つ分の 処理をする 関数だ。 すでに (入力用に) オープンされている ストリームを 引数として とる。 fopen() 関数が 返してきた ストリームへのポインタ (もしくは stdin) を 引数として 指定してやれば、それを 入力として 処理をする (そのまま 標準出力へ コピーする)。(p76)

cant() は、エラーメッセージを 出力して 終了する - exit() する - だけの 関数だ。

一般に 関数は 処理が終了すると その呼び出し元へ 戻るのが 通常だが、この cant() のように その関数の中で exit() を 呼び出すと、プログラムは そこで 終了してしまう。

これを やってしまうと プログラムの流れを 把握しづらくなるので、あまり やたらと 行なうべきではない。 exit() 関数を 呼び出すのは、main() のほかには、異常終了のための 処理を行なう 関数ぐらいに 限定しておくべきだ。(p77)

プログラムは 次のとおり、

/* cat2.c */
#include

void do_one(); /* プロトタイプ宣言 */
void cant();

main(int argc, char *argv[])
{
FILE *fp;

--argc;
++argv; /* argv[0] を スキップ */
if (argc < 1) {
fprintf(stderr, "parameter error\n");
exit (1);
}

while (argc--) {
if )((fp = fopen(*argv, "r"))( == NULL)
cant(*argv); /* no return */
do_one(fp);
fclose(fp);
argv++;
}

return 0;
}

void do_one(FILE *fp)
{
int c;

while )((c = fgetc(fp))( != EOF)
fputc(c, stdout);
}

void cant(char *name)
{
fprintf(stderr, "can't open %s\n", name);
exit (1);
}

前回同様、各関数の引数など 詳しいことは、どんどん とばしています。

*1:「作ってわかる Cプログラミング」