我正在尝试用 C++ 为 Linux 编写一个简单的文本编辑器。这需要一个 while 循环从终端读取字符,到目前为止,我只是显示它们的 ASCII 值。问题是使用不同的输入函数会产生不同的输出。
如果我使用
read()
从终端获取字符,我必须在每次 cout
之后手动刷新缓冲区以在每次按键后获取输出,例如:
char c = '0';
while ((read(STDIN_FILENO, &c, 1) == 1) && c != 'q') {
cout << std::hex << (int)c<<std::flush;
}
如果我不这样做,我只有在 while 循环结束后才会得到输出,即如果我按
q
。
另一方面,如果我使用
cin.get()
,那么我不会遇到任何问题。我可以简单地做
char c = '0';
while (cin.get(c) && c != 'q') {
cout << std::hex << (int)c;
}
对于上下文,由于我不知道这是什么类型的问题,这些是我的系统的一些详细信息:
OS: Debian GNU/Linux 12 (bookworm) x
Host: Blade 14 - RZ09-0370 1.04
Kernel: 6.1.0-17-amd64
Shell: zsh 5.9
DE: GNOME 43.9
提前致谢!
区别在于
cin.get
与 stdout 同步,因为 std::stream 库中有明确的代码(请参阅 std::basic_ios<CharT,Traits>::tie
)。
如果您直接从
stdin
文件描述符读取,您将完全绕过标准库流,并且输出不会在输入之前刷新,因为库不知道您正在请求输入。
PS:如果你正在编写一个在 Linux 终端中运行的编辑器,你可能应该使用
ncurses
库,它可以处理很多这些细节,还可以处理所有组合键和特殊键(如箭头、功能键、shift 、 ctrl 等)。