python - 为什么以下代码在 C 和 Python 中给出不同的输出?
问题描述
我想在 Unix 中实现 $cat 的输入获取过程。在无限循环中,每当我按下任何键时,相应的字母都会打印在屏幕上。如果我按 ctrl+d,循环将被终止。
这个 TurboC 代码正是我想要的:
#include<stdio.h>
#include<conio.h>
void main()
{
char ch;
while(1)
{
ch = getch();
if(ch == 4)
break;
else
printf("%c", ch);
}
}
但是每当我切换到 Python3 时,它就会产生问题。
from msvcrt import getch
while True:
ch = getch()
if ord(ch) == 4: break
else: print(ch.decode(), end="")
当程序处于无限循环时,它不会打印任何东西,但我正在按键。最后,当我按下 ctrl+d 时,之前输入的所有字符都会一起打印。
如何在 Python 中实现它?
解决方案
问题是 Python 中的输出是缓冲的,除非您使用sys.stdout.flush()
或print(ch.decode(), end="", flush=True)
按照@AlbinPaul 的建议刷新它。如果您使用 C++std::cout
而不是printf
. 其背后的想法是每个输入/输出操作都非常昂贵,因此如果立即将每个字符一个接一个地输出到输出设备中,您会观察到性能下降。将输出保存在内存中并仅不时刷新此累积输出要便宜得多,因此大多数高级语言选择缓冲输出。
有时,如果您需要实时交互(例如您的情况),这种缓冲可能会带来问题。另一个可能臭名昭著的问题是竞争性编程:不要忘记刷新输出,否则会达到时间限制。
推荐阅读
- java - 控制器方法持久性问题
- javafx-8 - 如何在附加到 TilePane 的按钮上显示图像
- ios - 如果不将其添加到超类并在每个子类中覆盖它,则不会调用子类委托函数
- python - 如何在 XPath 中处理动态变化的 ID?
- batch-file - 如何从批处理文件本身中找到已编译的 bat (.exe) 目录?
- macos - 您可以在 MacOS 上跟踪进程的 I/O 活动吗?
- database-design - 强制数据库约束
- assembly - equ $ - 指令如何以 nasm 语法获取字符串的长度?
- elasticsearch - 如何解决在 Windows 中启动 Kibana 时出现的错误“No living connection”
- angular - 使用 Angular 材料的自定义验证