C言語の航海日誌(3)

少し日が空きましたが、写経は少しずつ進めていて、前回から今日までに8本のサンプルコードを写経しました。

ページで言うとp101〜157まで。
全340ページなので、もうすぐ半分に辿りつきそうです。

写したコードは、たとえば以下。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *in_fp;
    FILE *out_fp;
    int ch;

    /* 入力用のファイルポインタの取得 */
    in_fp = fopen("data.txt", "r");
    if (in_fp == NULL) {
        fprintf(stderr, "ファイルが開けません\n");
        exit(1);
    }

    /* 出力用のファイルポインタの取得 */
    out_fp = fopen("out", "w");
    if (out_fp == NULL) {
        fprintf(stderr, "ファイルが開けません\n");
        exit(1);
    }

    while ((ch = getc(in_fp)) != EOF) {
        putc(ch, out_fp);
    }

    /* 使い終わったファイルポインタを閉じる */
    fclose(in_fp);
    fclose(out_fp);

    return 0;
}

ポインタへの変数が出てきていますが、じつはまだこの段階ではポインタの解説は始まっていなくて、書中ではひとまず「おまじない」として扱うよう言われます。
実際にポインタの解説が始まるのはさらに40ページ以上先に行ってから。

このサンプルコードにおけるメイン・トピックは、fopen関数(ファイルのオープン)です。

ぼくは大体、Cのサンプルコードを写しながらいつも「Perlだとどうなんだっけ」と頭の中で比べているんですが、そういう比較対象というか参照軸がひとつあると、また印象に残りやすい気がしています。

で、CとPerlだとほとんど同じように考えられるものもあれば、ちょっと違うな……みたいなものもあって、このファイル入出力の関数は後者かなと。似ているところもあるけど、違って感じられる要素のほうが多いというか。
ちなみに、ほとんど同様に使えるなと思ったのはif文、while文あたりです。

もう一つ、これも印象的なトピックでした。

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;

    for (i = 0; i < argc; i++) {
        printf("argv[%d]: %s\n", i, argv[i]);
    }

    return 0;
}

ポインタが2重にくっついていて、それについては上記同様、ここでも「おまじない」扱いですが、コマンドライン引数の受け取り方を少し把握できた気がします。

この後は、仮引数の使い方、関数の分割、プロトタイプ宣言などを学んで、その後にようやくポインタが出てくるようです。

ポインタについてはすでに同書を含む書籍の通読や、ドットインストールを通して概要はチェック済みですが、実際に手を動かしながら理解していくのはこの後なので、楽しみです。

C言語体当たり学習 徹底入門 (標準プログラマーズライブラリ)

C言語体当たり学習 徹底入門 (標準プログラマーズライブラリ)