Personal tools
You are here: Home ブログ matsuyama 標準出力の行バッファリングを無効にする
Document Actions

標準出力の行バッファリングを無効にする

setvbuf関数でバッファリングモードを動的に変更することによって行バッファリングを無効にすることができます。使う頻度が高いわりによく忘れてしまうのでメモ。

setvbuf:

int setvbuf(FILE *stream, char *buf, int mode , size_t size);

modeには_IOFBF(full buffering), _IOLBF(line buffering), _IONBF(no buffering)を指定できます。今回はバッファリングを無効にしたいので_IONBFを使います。標準出力はデフォルトでは行バッファリングなので、改行コードが出力されるまでは何を出力してもバッファにたまるばかりで実際には出力されません。通常は行バッファリングで困ることはないのですが、まれに一文字一文字出力したいというような要求がでてくることがありますので、そのときは以下のようにstdoutのバッファリングモードを無効にしてしまいましょう。

setvbuf(stdout, 0, _IONBF, 0);

こうしておくことで

printf("foo");

のような場合でも改行コードを待たずに直ちに出力されます。

例えば出力位置を変えずに数字を出力していきたい場合などには有効な対策になります。

setvbuf(stdout, 0, _IONBF, 0);
printf("    0");
for (int i = 0; i < 10000; i++) {
    for (int j = 0; j < 5; j++) {
        putc(0x08, stdout); // BS
    }
    printf("%5d", i);
}

実際こういうやり方が正攻法なのかは知りませんが一応動きます。もっとちゃんとやろうと思えばcursesとかncursesを使うらしいです。さらっとドキュメント見た限りでは使いたくなるようなライブラリではありませんでしたが。

Category(s)
program
linux
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/disable-stdout-line-buffering/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.