はじめての C

C programming note*1
少し戻って、次のような「標準入力の内容を そのまま 標準出力に 出力する」プログラムが でてくる。(p16)

/* typ1.c */
#include

main()
{
int c;

while )((c = getchar())( != EOF)
putchar(c);
}

これを 標準入力ではなく、ファイルから 読み込ませるには、

標準入力の代わりに、起動時の コマンドラインの 第1パラメータで指定された 名前のファイルを 入力とする。

その入力用ファイルを オープンできないときには エラーメッセージを 表示して 終了する。 また 指定された パラメータの数が 1つでなかったとき (0, または 2つ以上のとき) も、エラーメッセージだけで 終了する (p42)

ようにする。

/* typ2.c */
#include

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

if (argc != 2) {
fprintf(stderr, "parameter error\n");
exit (1);
}

if )((fp = fopen(argv[1], "r"))( == NULL) {
fprintf(stderr, "can't open %s\n", argv[1]);
exit (1);
}

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

return 0;
}

そういえば、これまで つくった プログラムは 全部 標準入力させてたような ...
ところで、

return という キーワードは、そこで 関数の処理を 終了して 呼び出し元に 戻る 働きをする。 return の 終ろに 値が 書いてある場合は、それが その関数の 戻り値 return value として 設定される。

なぜ exit() を 使わず return で 値を 返すようにしたかというと、main() が 実は int型の 値を返す 関数だからだ。 このように return するように しておけば、コンパイラも「main() 関数に return文がない」という 警告メッセージを 出さなくなる。(p84)

これは 知らなかった。

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