我注意到以下代码:
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
C ++命令窗口中的输出会自动在下一行中输入“Is spaced spacing”。它会将cin
行之后的任何内容置空,而不需要使用流操作符(为什么这称为流操作符?)endl
。如果我只有代码:
cout << "Please enter your number: ";
cout << "Is this spaced";
它不会自动将行隔开“是这个间隔”。相反,两条线都连在一起。我很想知道为什么会这样,因为我一直认为你需要endl
来创建一个新的空间线。
谢谢!
答案 0 :(得分:5)
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”。程序内存储和数据连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新。
答案 1 :(得分:1)
默认情况下,cin
会在收到newline
并添加新行时结束读取流。
答案 2 :(得分:0)
当您在终端上使用cin
(std::cin
)时,通常需要按Enter键告诉终端“嘿,我的输入已完成。”
Enter也会被翻译为换行符,因此按下了std::endl
,它基本上是Enter
。
在许多情况下,您可以使用退格符\b
来回溯控制台的当前写入。它可能会让你尝试std::cout << '\b'
:它碰巧在我的终端(Windows)中回溯。