printf缓冲区刷新问题

以下内容在Linux测试,Window因为没遵循POSIX,所以现象会有不同。

一、前言

首先,printf缓冲区的问题,平时不大会发现,当时是在使用sleep函数时出现的。先来看一下问题。

#include <stdio.h>

int main()
{
    printf("hello\n");
    sleep(1);  //延迟1秒
    printf("world\n");
    return 0;
}

上面的代码正常输出:
hello
world
两个之间间隔一秒输出

接下来做一下修改:

#include <stdio.h>

int main()
{
    printf("hello"); /*去掉转义字符'\n'*/
    sleep(1);
    printf("world\n");
    return 0;
}

上面的代码输出为:
helloworld
但是输出却是延迟一秒之后才将helloworld一起输出

当我们去掉转义字符‘\n’,延迟函数sleep不再在语句间延迟,而是变成延迟整个程序。

二、深入理解printf

printf是一个行缓冲函数,先写到缓冲区,满足一定的条件后,才会将缓冲区内容输出到对应文件中,如下几个条件可以刷新缓冲区:

1 缓冲区填满。
2 写入的字符中有‘\n’ , ‘\r’。
3 调用fflush手动刷新缓冲区。
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
5 调用printf函数的进程或线程结束会调用fflush函数

接下来我们修改一下程序

include <stdio.h>

int main()
{
    printf("hello");
    fflush(stdout);   //强制刷新缓存,输出显示
    sleep(1);
    printf("world\n");

    return 0;
}

这个时候的效果就是先输出hello,然后1秒之后再输出world。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页