2006/12/03
標準出力の行バッファリングを無効にする
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を使うらしいです。さらっとドキュメント見た限りでは使いたくなるようなライブラリではありませんでしたが。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/disable-stdout-line-buffering/tbping