我在 C 项目中使用 ncurses
库,在使用 printf()
/puts()
时遇到问题> 在初始化 curses 之后 和 去初始化。这是一个简化的例子:
initscr();
endwin();
puts("first");
usleep(1e6);
puts("second");
first
和 second
只会在包含的可执行文件退出后(一秒多一点后)出现在屏幕上,而不是打印 first
首先,然后,一秒钟后,second
。 ncurses
似乎以某种方式缓冲 stdout
并且仅在退出时刷新它。 fflush(stdout)
似乎解决了这个问题:
initscr();
endwin();
puts("First.");
fflush(stdout);
usleep(1e6);
puts("Second");
当 stdout
被手动刷新时,输出会按预期显示(有第二个间隙)。但是,如果我之后要添加更多 puts()
语句,中间有 usleep()
,我需要重复调用 fflush(stdout )
在每个之后,我想知道是否有更好的解决方案,比如说,将程序永久重置为 pre-curses 模式。
最佳答案
ncurses
调用 setvbuf
,将流置于完全缓冲模式。要么指定环境变量 NCURSES_NO_SETBUF
以指示它不要更改缓冲,要么通过再次调用 setvbuf
恢复缓冲模式,尽管 man 3 setvbuf
建议反对:
The setvbuf() function may be used at any time, but may have peculiar side effects (such as discarding input or flushing output) if the stream is ``active''. Portable applications should call it only once on any given stream, and before any I/O is performed.
以下是如何将 stdout
恢复为行缓冲并将 stderr
再次恢复为无缓冲:
#include <stdio.h>
#include <unistd.h>
#include <ncurses.h>
int main() {
initscr();
endwin();
setvbuf(stdout, NULL, _IOLBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
puts("First.");
usleep(1e6);
puts("Second");
return 0;
}
关于c - 使用 ncurses 后的 printf()/puts(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422205/