2

我注意到在以下代码中:

    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为了创造一个新的空间线。

谢谢!

4

3 回答 3

6
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”。程序内存储和数据连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新。

于 2013-03-15T06:09:24.043 回答
1

默认情况下cin,当它收到一个newline也添加新行的流时结束读取流。

于 2013-03-15T05:06:45.197 回答
0

当您在终端上使用cin( std::cin) 时,您通常必须按 Enter 键来告诉终端“嘿,我的输入完成了”。

Enter 也被翻译为换行符,因此它粘贴本质上是 astd::endl因为您按下了Enter

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

于 2013-03-15T05:08:57.317 回答