强制终端输出缓冲区刷新
Force the terminal output buffer to flush
在D中写一个CLI工具,我有一个进度计数器,它是一个循环,打印下一个数字,前面有一个\r。
这是一个显示问题的最小示例
import std.stdio;
import core.thread;
void main(string[] args) {
for (int i = 0; i < 10000; i++) {
write("\r", i);
Thread.sleep(msecs(1));
}
}
我注意到,至少 mac 终端会缓冲输出,一旦打印换行符或打印一定数量的字符,输出就会被刷新。
对我来说,这意味着计数器滞后并且偶尔会上升。
我的问题是,
如何在不打印换行符的情况下强制刷新输出缓冲区?
'clearing the buffer' 你可能是指冲洗。 stdout.flush;
应该可以解决问题。
清除通常是指从控制台中删除所有输出以获得干净的 window。
除了 weltensturm's 定期接听电话 stdout.flush
之外,您还可以尝试使用
手动设置缓冲
stdout.setvbuf(0, _IOLBF);
有关概述,请参阅 IEEE Std 1003.1, 2013 - setvbuf(或您当地的联机帮助页)。
在D中写一个CLI工具,我有一个进度计数器,它是一个循环,打印下一个数字,前面有一个\r。
这是一个显示问题的最小示例
import std.stdio;
import core.thread;
void main(string[] args) {
for (int i = 0; i < 10000; i++) {
write("\r", i);
Thread.sleep(msecs(1));
}
}
我注意到,至少 mac 终端会缓冲输出,一旦打印换行符或打印一定数量的字符,输出就会被刷新。
对我来说,这意味着计数器滞后并且偶尔会上升。
我的问题是, 如何在不打印换行符的情况下强制刷新输出缓冲区?
'clearing the buffer' 你可能是指冲洗。 stdout.flush;
应该可以解决问题。
清除通常是指从控制台中删除所有输出以获得干净的 window。
除了 weltensturm's 定期接听电话 stdout.flush
之外,您还可以尝试使用
stdout.setvbuf(0, _IOLBF);
有关概述,请参阅 IEEE Std 1003.1, 2013 - setvbuf(或您当地的联机帮助页)。