一个write和printf混用的例子

我们知道,C语言中,write和printf都可以完成向屏幕输出的任务。
但是write是不带缓冲的输出,printf是带缓冲的输出。当它们二者混用时,就会出现一些意料之外的问题。
请看下面的代码

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

int main(){
    printf("1");
    write(STDOUT_FILENO, "2", 1);
    printf("3");
    write(STDOUT_FILENO, "4", 1);
    printf("5\n");
    write(STDOUT_FILENO, "6", 1);
    return 0;
}

按照程序的执行流程,输出的结果应该是"12345[换行]6"。
但是实际上屏幕的输出结果是"24135[换行]6"
原因是这样的,write函数不带缓冲区,因此每当程序执行到write函数时,就会立即向屏幕输出。而printf是带缓冲区的,只有当缓冲块满或是遇到换行符,才会将缓冲区的内容一并向屏幕输出。
为了避免这种情况,不应将两种输出函数混用,或者是对于printf出的不以换行符结尾的字符串,用一个fflush函数强制清空缓冲区,输出到屏幕上,就得到下面的代码。

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

int main(){
    printf("1");
    fflush(stdout);
    write(STDOUT_FILENO, "2", 1);
    printf("3");
    fflush(stdout);
    write(STDOUT_FILENO, "4", 1);
    printf("5\n");
    write(STDOUT_FILENO, "6", 1);
    return 0;
}
//PRINT: 12345 \n 6
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值