c - 使用 ncurses 后的 printf()/puts()

标签 c ncurses

我在 C 项目中使用 ncurses 库,在使用 printf()/puts() 时遇到问题> 在初始化 curses 之后 去初始化。这是一个简化的例子:

initscr();
endwin();

puts("first");
usleep(1e6);
puts("second");

firstsecond 只会在包含的可执行文件退出后(一秒多一点后)出现在屏幕上,而不是打印 first 首先,然后,一秒钟后,secondncurses 似乎以某种方式缓冲 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/

相关文章:

c++ - 在 C++ 中将整数存储到 char* 中

c - Mac OS X 中的 getopt

c - 如何使用Ncurses在屏幕坐标中找到光标位置?

c - 是否可以在ncurses库中绘制如下图表并实时更新?

c - Ncurses - 当函数调用中存在多个参数时,为什么不使用 mvprintw() 打印字符串不起作用?

rust - 如何使用 ncurses crate 显示方框图字符?

c - 在多个c宏贴之间添加空格

C++/Win32 在不知道签名的情况下动态调用函数

c - 为什么省略参数的显式 'int' 类型有时无法在 gcc 中编译?

c - 在C中将字符串解析为 float