endl和cout之后的行间距?

时间:2013-03-15 05:03:36

标签: c++ line cout spacing endl

我注意到以下代码:

    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来创建一个新的空间线。

谢谢!

3 个答案:

答案 0 :(得分:5)

cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";

除此之外还有更多的东西。默认情况下,std::coutstd::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)

当您在终端上使用cinstd::cin)时,通常需要按Enter键告诉终端“嘿,我的输入已完成。”

Enter也会被翻译为换行符,因此按下了std::endl,它基本上是Enter

在许多情况下,您可以使用退格符\b来回溯控制台的当前写入。它可能会让你尝试std::cout << '\b':它碰巧在我的终端(Windows)中回溯。