前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用setvbuf更改printf的默认buffer 行为

使用setvbuf更改printf的默认buffer 行为

作者头像
用户7886150
修改2021-02-14 15:09:17
1.4K0
修改2021-02-14 15:09:17
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ setvbuf()

有3种buffer行为,“不缓冲”,“基于块的缓冲”和“基于行的缓冲”。stdout(printf)默认是基于行的缓冲,即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候,这些字符才会被打印出来;标准错误输出stderr默认是不缓冲的,即写到stderr的字符会马上被打印出来。 

    下面的例子每隔1S,用printf输出一个“Hello World!”字符串: 

#include <stdio.h>

#include <unistd.h>

int main(void)

{

    while (1) {

        printf("Hello World!");

        sleep(1);

    }

    return 0;

}

 实际运行的结果是很长一段时间内BUFSIZ没有被填满前,没有任何输出。前面提到stdout(printf)是“基于行的缓冲”,我们在“Hello World!”后加一个换行“\n”试试。

#include <stdio.h>

#include <unistd.h>

int main(void)

{

    while (1) {

        printf("Hello World!\n");

        sleep(1);

    }

    return 0;

}

 运行结果是每隔1S有一个“Hello World!”和换行输出,如下:

Hello World! Hello World! Hello World! Hello World!  

    下面尝试通过int setvbuf(FILE *stream, char *buf, int mode, size_t size); 更改stdout的默认缓冲行为,将line buffered修改为unbuffered。 

#include <stdio.h>

#include <unistd.h>

int main(void)

{

    setvbuf(stdout, NULL, _IONBF, 0);

    while (1) {

        printf("Hello World!");

        sleep(1);

    }

    return 0;

}

 运行结果是每隔1S有一个“Hello World!”输出,如下:

Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!  

    基于stdout和stderr的缓冲行为,如果我们在调试问题打印输出的时候想马上看到输出结果,可以将stdout的line buffered修改为unbuffered,或者使用fprintf(stderr, ...)。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档