cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
这不仅仅是表面上看到的。 std::cout
并且std::cin
是 - 默认情况下 -绑定流。这意味着每当被要求输入时,它std::cout
都会自动刷新(即,任何挂起的输出从程序内的任何缓冲区刷新到操作系统) 。std::cin
这就是为什么您可以确保"Please enter your number: "
在程序暂停等待您输入之前看到。当然,在大多数操作系统中,您可以在程序等待之前开始输入 - 它会将其回显到终端并记住它以便std::cin
稍后提供:当您使用管道调用程序时也会发生这种情况,例如:
echo "123" | the_program
输入在the_program
开始运行时可用,但用于cin >> Number;
尝试解析。但是在这种情况下,终端程序没有键盘输入可以回显,因此“123\n”序列不会在两行输出之间回显到屏幕上 - 如果没有换行符“\n”,您的输出将全部出现在一行上。
如果您想在键盘输入不将光标移动到下一行的情况下从键盘读取,则最好使用 ncurses 或类似的库。库可以使用适合您终端的转义序列(如果可用)将光标重新定位到您喜欢的位置。如果您要支持的终端范围非常有限(例如,只有与 xterm 兼容的终端、VT220 或 Windows 命令 shell),那么您自己编写代码可能是可行的。通常也可以抑制键盘输入的打印,但是用户看不到自己键入数字。另一种选择是将终端设置为支持逐字符输入读取的输入模式(某些终端默认为逐行,因此您可以
另外,最好用换行符结束程序的输出,因为某些调用环境不会显示最后一行。而且,这有点争议,但恕我直言,std::endl
当您不需要刷新输出时最好不要使用 - 只需使用\n
并让 C++ iostream 库缓冲多行并将它们以有效大小的块写入操作系统。
冲水的解释
假设你有一个这样的程序:
std::string h = "hello ";
std::string w = "world";
std::cout << h;
std::cout << w << '\n';
在某个阶段,程序需要告诉操作系统(Linux、Windows 等)要打印的文本,让它发送到 shell/cmd 提示符(可能会将其发送到屏幕并放入缓冲区中)对于滚动条等),文件或其他任何东西。从总体上看,程序告诉操作系统做这种事情是很慢的,所以如果它记住“hello”,添加“world”和\n
(换行符),整个程序会运行得更快。它,然后一次向操作系统发送“hello world\n”。程序内存储和数据连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新。