『Head First C』第3章 小さなツールの作成

  • コマンドラインで > を使うと、標準出力をファイルにリダイレクトできる
  • 2> を使うと、標準エラーをリダイレクトできる
  • printf()は、fprintf(stdout)のショートカットである
  • fprintf(stderr)で標準エラーを出力できる
  • 通常、1つのプロセスが持てるデータストリームの数は256個まで
  • コマンドライン引数は、文字列ポインタの配列としてmain()に渡される
/**
* ピザの注文を処理するプログラム
*/

#include <stdio.h>
#include <unistd.h> // POSIXライブラリ(getopt()を使うために読み込み)

int main(int argc, char *argv[]) // argcには引数の個数、argvには引数が入っている
{
    char *delivery = "";
    int thick = 0;
    int count = 0;
    char ch;

    // getopt()の第3引数で、オプションの名前を指定する。
    // getopt()の第3引数で、オプション名の後ろに:をつけると、オプション名の後ろに引数が続くことを示す
    while ((ch = getopt(argc, argv, "d:t")) != EOF) { // dオプション(引数有り)とtオプション(引数無し)が有効
        switch (ch) {
            case 'd':
                delivery = optarg; // optargはオプションの引数
                break;
            case 't':
                thick = 1;
                break;
            default:
                fprintf(stderr, "Unknown option: '%s'\n", optarg);
                return 1;
        }
        // optindにはコマンドラインから読み込んだ文字列数が格納される
        argc -= optind;
        argv += optind;

        if (thick)
            puts("Thick crust.");

        if (delivery[0])
            printf("To be delivered %s.\n", delivery);

        puts("Ingredients:");

        for (count = 0; count < argc; count++)
            puts(argv[count]);
    }

    return 0;
}

感想

標準入力・標準出力・標準エラーや、リダイレクト、パイプ、小さなツールの組み合わせ等、CプログラムというよりはUnix(の、主にコマンドライン)入門という趣の章だった。

そもそもCはUnixのために作られた言語なので、内容的には妥当だと思う。ただ、Windows環境の人は違和感を感じる章かも。

また、本章で題材とした「CSVからJSONへの変換」のような仕事を行う「小さなツール」は、Cよりも、スクリプト言語で書いたほうが簡単。例えばRubyなら、CSVからJSONへの変換は、以下の3行で書ける(CSVデータの取り扱いは面倒なので、自前で実装するのではなく、言語やライブラリの力を借りるべき)。

require 'csv'
require 'json'

CSV.parse(data).to_json
出典:http://stackoverflow.com/questions/5357711/csv-to-json-ruby-script