为什么输出是在没有换行的情况下睡觉后?

时间:2018-03-24 08:11:50

标签: c++ c

我正在使用gcc 7.3和g ++ 7.3。 GCC和G ++出错。例如,

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("a");
    sleep(1);
    return 0;
}
等待1秒后打印

'a',但是当我使用printf("a\n");时,它正常工作。它在C ++上是一样的。例如,

#include <iostream>
#include <unistd.h>

int main() {
    std::cout << "a";
    sleep(1);
    return 0;
}
等待1秒后,

'a'打印。但是,当我使用std::cout << "a" << std::endl;时,它可以正常工作。问题是什么以及如何解决?

2 个答案:

答案 0 :(得分:3)

sleep()就像手动安排流程printf()将数据放入stdout流中,而不是直接在监视器上。

printf("a"); /* data is there in stdout , not flushed */ 
sleep(1); /* as soon as sleep(1) statement occurs your process(a.out) jumped to waiting state, so data not gets printed on screen */ 

因此,您应该使用fflush(stdout)或使用\n清除stdout信息流。

答案 1 :(得分:1)

您会看到此行为,因为stdout在与终端一起使用时通常为line buffered,与文件一起使用时为fully buffered,字符串将存储在缓冲区中,可以通过输入新行或缓冲区填充或程序终止时

您也可以使用setvbuf覆盖缓冲模式,如下所示

setvbuf(stdout, NULL, _IONBUF, 1024);
printf("a");

它将打印a而不进行缓冲,请查看https://www.tutorialspoint.com/c_standard_library/c_function_setvbuf.htm以使用setvbuf

还可以查看不同类型的缓冲流。

希望这会对你有所帮助。