endl和cout之后的行间距?

Jus*_*ang 1 c++ cout line spacing endl

我注意到在以下代码中:

    cout << "Please enter your number: ";
    cin >> Number;
    cout << "Is this spaced";
Run Code Online (Sandbox Code Playgroud)

C++命令窗口中的输出会自动在下一行中输入"Is spaced spacing".它将cin行后的任何内容都空间化而不需要使用流操纵器(为什么这称为流操纵器?)endl.如果我只有代码:

    cout << "Please enter your number: ";
    cout << "Is this spaced";
Run Code Online (Sandbox Code Playgroud)

它不会自动将行隔开"是这个间隔".相反,两条线都连在一起.我很想知道为什么会这样,因为我一直认为你需要endl创造一个新的空间线.

谢谢!

Ton*_*roy 5

cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
Run Code Online (Sandbox Code Playgroud)

除此之外还有更多的东西. std::cout并且std::cin- 默认情况下 - 绑定流.这意味着std::cout每当std::cin要求输入时,都会自动刷新(即从程序内的任何缓冲区刷新到系统中的任何挂起的输出).这就是为什么你可以确定"Please enter your number: "在程序暂停之前看到等待你输入的原因.当然,在大多数操作系统中,您可以在程序等待之前开始输入 - 它会将它回显给终端并记住它std::cin以后提供:当您使用管道调用程序时会发生这种情况,例如:

echo "123" | the_program
Run Code Online (Sandbox Code Playgroud)

输入在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';
Run Code Online (Sandbox Code Playgroud)

在某个阶段,程序需要告诉操作系统(Linux,Windows等)有关要打印的文本,让它将其发送到shell/cmd提示符(可能会将其发送到屏幕并将其放入缓冲区中)滚动条等),文件或其他.在宏观方案中,程序告诉操作系统执行此类操作的速度很慢,因此如果它记住"hello",添加"world"和\n(换行符),整个程序将更快地运行它,然后立即向操作系统发送"hello world \n".程序内存储和数据连接称为缓冲,将数据从缓冲区写入操作系统的行为称为刷新.