为什么以下代码在 C 中给出不同的输出,Python?
why does following code give different output in 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 中的输出被缓冲,除非您按照@AlbinPaul 的建议用 sys.stdout.flush()
或 print(ch.decode(), end="", flush=True)
刷新它。如果您使用 std::cout
而不是 printf
,您可能会遇到与 C++ 相同的问题。这背后的想法是每个 input/output 操作都非常昂贵,因此如果您立即将每个字符一个一个地输出到输出设备,您会观察到性能下降。将输出保存在内存中并时不时刷新累积的输出要便宜得多,因此大多数高级语言选择缓冲输出。
如果您需要实时交互(就像您的情况),有时这种缓冲会带来问题。另一个可能臭名昭著的问题是竞争性编程:不要忘记刷新你的输出,否则你会达到时间限制。
我想在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 中的输出被缓冲,除非您按照@AlbinPaul 的建议用 sys.stdout.flush()
或 print(ch.decode(), end="", flush=True)
刷新它。如果您使用 std::cout
而不是 printf
,您可能会遇到与 C++ 相同的问题。这背后的想法是每个 input/output 操作都非常昂贵,因此如果您立即将每个字符一个一个地输出到输出设备,您会观察到性能下降。将输出保存在内存中并时不时刷新累积的输出要便宜得多,因此大多数高级语言选择缓冲输出。
如果您需要实时交互(就像您的情况),有时这种缓冲会带来问题。另一个可能臭名昭著的问题是竞争性编程:不要忘记刷新你的输出,否则你会达到时间限制。