我正在try 用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个文件描述符读取,则完全绕过了标准库流,并且输出不会在输入之前刷新,因为库不知道您正在请求输入.

附言:如果你正在编写一个运行在linux终端上的编辑器,你可能应该使用ncurses库,它可以处理很多细节,也可以处理所有的组合键和特殊键(如箭头,功能键,shift,candle等).

Linux相关问答推荐

grep条件仅抓取某些文本

awk:try 将时间戳字符串转换为unix纪元时间

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

将参数#0更改为shell脚本不工作

在shell 中使用排除模式的grep

如何将参数传递给Bash函数

如何正确Forking 并完成进程以避免 EAGAIN 错误

如何使 awk 输出更具可读性?

使用文件名重新打开 linux 管道(仅从一侧)

将 Visual Studio C++ 项目迁移到 Linux 和 CMake

将行转换为一条

用户级线程如何与内核级线程对话

我想为 Linux 内核做贡献

如何使用文件描述符刷新写入?

bash 中的线程?

C++:使用 longjmp 和 setjmp 安全吗?

比较两个图像的 python/linux 方式

如何让 cron 每N分钟运行一次,其中 n % 5 == 1?

在 Unix 上计算每行/字段的字符出现次数

具有所有内核的 Gzip