【发布时间】:2021-01-13 15:56:10
【问题描述】:
为什么这个程序的输出没有下划线
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
write(1, "Hello world!\n", 13);
tputs(tgetstr("ue", NULL), 1, &putchar);
}
但这是?
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
puts("Hello world!");
tputs(tgetstr("ue", NULL), 1, &putchar);
}
编辑
问题确实与缓冲区管理有关!如果我添加fflush,则字符串会正确加下划线
int main() {
tgetent(NULL, getenv("TERM"));
tputs(tgetstr("us", NULL), 1, &putchar);
fflush(stdout);
write(1, "Hello world!\n", 13);
tputs(tgetstr("ue", NULL), 1, &putchar);
}
【问题讨论】:
-
因为 termcap/terminfo 假定它完全控制了显示,而
write()颠覆了这一点。您必须refresh()才能获得放置的 termcap/terminfo 信息。那么如果你幸运的话,write()可能会起作用。但是您不应该将 termcap/terminfo 函数与低级write()(或read())函数混合使用。 -
@JonathanLeffler 谢谢!但是
write()与putchar()和puts()等“高级”函数有何不同?除了缓冲区管理? -
嗯……我很想说“这都是关于缓冲区管理的”,但这是假设
curses而不仅仅是termcap或terminfo。然后我做了噩梦......然后我查看了手册页(Mac 上的man 3 tputs),它们毕竟是curses的一部分——因此很可能它是都是关于缓冲区管理的。您没有展示 MCVE(Minimal, Complete, Verifiable Example — 或 MRE 或 SO 现在使用的任何名称)或 SSCCE(Short, Self-Contained, Correct Example)。程序中还有什么? -
问题确实与缓冲区管理有关!感谢您的帮助:)
-
The issue is, indeed请将其发布为您问题的答案。