为什么 read() 和 cin.get() 对输出缓冲区的影响不同?

问题描述 投票:0回答:1

我正在尝试用 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 

提前致谢!

c++ linux unix terminal
1个回答
0
投票

区别在于

cin.get
与 stdout 同步,因为 std::stream 库中有明确的代码(请参阅
std::basic_ios<CharT,Traits>::tie
)。

如果您直接从

stdin
文件描述符读取,您将完全绕过标准库流,并且输出不会在输入之前刷新,因为库不知道您正在请求输入。

PS:如果你正在编写一个在 Linux 终端中运行的编辑器,你可能应该使用

ncurses
库,它可以处理很多这些细节,还可以处理所有组合键和特殊键(如箭头、功能键、shift 、 ctrl 等)。

© www.soinside.com 2019 - 2024. All rights reserved.