繁体   English   中英

endl和cout之后的行间距?

[英]Line spacing after endl and cout?

我在以下代码中注意到了这一点:

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

C ++的命令窗口中的输出会自动在下一行添加“是否已隔开”。 它在cin行之后cin任何内容,而无需使用流操纵器(为什么将其称为流操纵器?) endl 而如果我只有代码:

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

它不会自动用“此间距”分隔行。 而是将两条线连接起来。 我很想知道为什么会这样,因为我一直认为您需要endl才能创建新的空间行。

谢谢!

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

这不仅是吸引眼球的事情。 std::coutstd::cin是默认情况下的绑定流。 这意味着,每当要求输入std::cin时,都会自动刷新std::cout (即,将任何未完成的输出从程序内的任何缓冲区刷新到操作系统)。 因此,您可以在程序暂停等待键入之前确保看到"Please enter your number: " 当然,在大多数操作系统中,您可以在程序等待之前开始键入-它会回显到终端,并记住它稍后提供给std::cin :当您使用以下管道调用程序时,也会发生这种情况:

echo "123" | the_program

the_program开始运行时,输入可用,但在the_program输入cin >> Number; 尝试解析。 不过,在这种情况下,没有键盘输入供终端程序回显,因此在两行输出之间的屏幕上未回显“ 123 \\ n”序列-没有换行符“ \\ n”,您的输出将全部出现在一行上。

如果您想在键盘输入没有光标移动到下一行的情况下进行读取,最好使用ncurses或类似的库。 这些库可以使用适合您终端的转义序列(如果有)来将光标重新定位到您喜欢的位置。 如果您要支持的终端范围非常有限(例如,仅与xterm兼容的终端,VT220或Windows命令外壳),则自行编写代码可能是实用的。 通常也可以禁止打印键盘输入,但是这样用户看不到自己在键入数字。 另一个选择是将终端设置为支持逐字符输入读取的输入模式(某些终端默认为逐行,因此直到按下回车键才能看到字符)-将其与抑制的回声结合起来程序可以在键入时打印数字,但不能打印换行符。

另外,最好用换行符结束程序的输出,因为某些调用环境否则不会显示最后一行。 而且,这有点争议,但是恕我直言,最佳实践是在不需要刷新输出时不使用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”发送到操作系统。 程序内的数据存储和连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新。

缺省情况下, cin收到newline也会结束读取流, newline还会添加newline

当在终端上使用cinstd::cin )时,通常必须按Enter才能告诉终端“嘿,我的输入完成了”。

Enter也被翻译为换行符,因此保留了本质上是std::endl因为您按了Enter

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM