next up previous contents
Next: 6 C プログラムにおけるファイルへの入出力 Up: 実験に役立つテクニック集    V1.2 Previous: 4 gnuplot でグラフを描こう

5 標準出力への出力を保存する方法

プログラムが標準出力に計算結果を出すことは多いが、それを保存するには?

以下では、飛び蹴りに近い方法も説明するが、あまり凝ったことをするより も、次節に紹介する方法を用いた方が良い。

標準出力に出力された結果を保存するには、色々な方法がある。

  1. 短ければマウスでカット&ペーストするのが簡単である。手順は、
    1. 保存したい領域の先頭にマウス・カーソルを移動して、左ボタンをクリック。
    2. 保存したい領域の末尾にマウス・カーソルを移動して、右ボタンをクリック。
    3. 入力待ち状態のウィンドウにマウス・カーソルを移動して、中ボタンをクリッ ク。
    というものである。(a), (b) の代わりに
    1. [(a')] 保存したい領域の先頭にマウス・カーソルを移動して、左ボタンを押す (離さないで押し続ける)。
    2. [(b')] そのまま保存したい領域の末尾までドラッグして、ボタンを離す。
    としても良い。
  2. script コマンドを用いる。
    script を実行してから、exit と打つまでの間に標準出力に出力さ れた文字は、typescript という名前のファイルに保存される 4
    
    oyabun% script
    
    Script started, output file is typescript
    oyabun% add
    add two integers: 2 3
    5
    oyabun% exit
    exit
    Script done, output file is typescript
    oyabun% cat typescript
    Script started on Sat Jan 24 20:42:51 1998
    oyabun% add
    add two integers: 2 3
    5
    oyabun% exit
    exit
    Script done on Sat Jan 24 20:43:02 1998oyabun%
    (なお、script コマンドの出力中の行末は C-m がついているの で、それを削除するには、例えば m2u コマンドが使って m2u typescript とすればよい。)
    参考までに add.c
    #include <stdio.h>
    main()
    {
        int a, b;
        printf("add two integers: ");
        scanf("%d %d", &a, &b);
        printf("%d\n", a + b);
    }
    
  3. (あまり対話性の少ない) コマンドの出力ならば、標準出力のリダイレクト を用いるのが簡単である。
    
    oyabun% add > add.out
    
    2 3
    oyabun% cat add.out
    add two integers: 5
    oyabun%

    この場合、少し使いにくいのは、add two integers: というプロンプ トが表示されないことである (add.out の方に行ってしまって、そちら を汚している)。これを回避するには (少々アクロバットであるが)
    add-tty.c
    #include <stdio.h>
    main()
    {
        int a, b;
        FILE *con;
        con = fopen("/dev/tty", "w");
        fprintf(con, "add two integers: ");
        scanf("%d %d", &a, &b);
        printf("%d\n", a + b);
    }
    

    のように、プロンプトは端末 (/dev/tty) に直接表示するように書き換 えれば良い5
    
    oyabun% add-tty > add.out
    
    add two integers: 2 3
    oyabun% cat add.out
    5
    oyabun%
  4. 標準出力をファイルに保存するが、画面でも見られるようにする、tee というコマンドがある。
    
    oyabun% add | tee add.out
    
    2 3
    add two integers: 5
    oyabun% cat add.out
    add two integers: 5
    oyabun%
    ここで、add two integers: というプロンプトがすぐには見えず、 タイミングがずれているのは、バッファーのフラッシュの問題である。これを 回避するには、プロンプトを上のように端末に直接出力するか、
    add-flush.c
    #include <stdio.h>
    main()
    {
        int a, b;
        printf("add two integers: "); fflush(stdout);
        scanf("%d %d", &a, &b);
        printf("%d\n", a+b);
    }
    

    のように fflush() を使って、バッファーを明示的にフラッシュすれば よい。確かに
    
    oyabun% add | tee add.out
    
    add two integers: 2 3
    5
    oyabun% cat add.out
    add two integers: 5
    oyabun%

    となる。
  5. Emacs の shell buffer で実行するという方法もある。Emacs (nemacs, mule) の中で
    
    M-x, shellリターン
    

    とすると、*shell* バッファーができる。この中で、普通の端末のよ うにコマンドが実行できるが、あくまでも Emacs のバッファーであるから、 内容はファイルに自由に書き出せる。


next up previous contents
Next: 6 C プログラムにおけるファイルへの入出力 Up: 実験に役立つテクニック集    V1.2 Previous: 4 gnuplot でグラフを描こう
桂田 祐史
2014-05-27