我注意到在下面的代码中:
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
C++ 命令窗口中的输出自动将“Is this spaced”放在下一行中。它将后面的任何内容隔开cin
行而不需要使用流操纵器(为什么这被称为流操纵器?)endl
。而如果我只有代码:
cout << "Please enter your number: ";
cout << "Is this spaced";
它不会自动用“Is this spaced”来分隔行。相反,两条线连接在一起。我很想知道为什么会出现这种情况,因为我一直认为你需要endl
为了创造一个新的空间线。
Thanks!
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
这里面的内容远比表面上看到的还要多。std::cout
and std::cin
是 - 默认情况下 -tied溪流。这意味着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”发送到操作系统。程序内数据存储和串联称为缓冲,而将数据从缓冲区写入操作系统的行为称为刷新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)