当前位置: 首页 > news >正文

C语言中printf()函数何时把内容输出到屏幕上?

在 C 语言中,printf() 函数用于将格式化的字符串输出到标准输出设备(通常是屏幕)。不过,printf() 函数并不一定会立即将内容输出到屏幕上,其输出时机主要取决于标准输出流(stdout)的缓冲模式,下面详细介绍不同缓冲模式下的输出时机:

1. 全缓冲(Full buffering)

原理:在全缓冲模式下,printf() 函数输出的内容会先被存储在缓冲区中,直到缓冲区被填满、程序正常结束或者显式地刷新缓冲区时,缓冲区中的内容才会被输出到屏幕上。
常见场景:通常对于磁盘文件的标准 I/O 操作采用全缓冲模式,但在某些系统中,当标准输出连接到文件而不是终端时,stdout 也可能是全缓冲的。
示例代码

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

int main() {
    // 输出内容到缓冲区
    printf("This is a full-buffered message.");
    // 休眠5秒,观察输出情况
    sleep(5);
    // 显式刷新缓冲区
    fflush(stdout);	//调用 fflush(stdout) 显式刷新缓冲区
    return 0;
}

代码解释:在上述代码中,printf() 函数输出的内容会先存储在缓冲区中,程序会休眠 5 秒,这期间屏幕上不会显示输出内容,直到调用 fflush(stdout) 显式刷新缓冲区,内容才会被输出到屏幕上。

2. 行缓冲(Line buffering)

原理:在行缓冲模式下,printf() 函数输出的内容会先被存储在缓冲区中,直到遇到换行符 \n、缓冲区被填满、程序正常结束或者显式地刷新缓冲区时,缓冲区中的内容才会被输出到屏幕上。
常见场景:当标准输出连接到终端时,stdout 通常采用行缓冲模式。
示例代码

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

int main() {
    // 输出内容到缓冲区,无换行符
    printf("This is a line-buffered message without newline.");
    // 休眠5秒,观察输出情况
    sleep(5);
    // 输出换行符,刷新缓冲区
    printf("\n");
    return 0;
}

代码解释:在上述代码中,第一个 printf() 函数输出的内容会先存储在缓冲区中,程序会休眠 5 秒,这期间屏幕上不会显示输出内容,直到第二个 printf() 函数输出换行符,缓冲区中的内容才会被输出到屏幕上。

3. 无缓冲(Unbuffered)

原理:在无缓冲模式下,printf() 函数输出的内容会立即被输出到屏幕上,不会进行缓冲。
常见场景:标准错误输出流 stderr 通常采用无缓冲模式,这样可以确保错误信息能够及时显示。
示例代码

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

int main() {
    // 输出内容,立即显示
    printf("This is an unbuffered message.\n");
    // 休眠5秒,观察输出情况
    sleep(5);
    return 0;
}

代码解释:在上述代码中,printf() 函数输出的内容会立即显示在屏幕上,然后程序会休眠 5 秒,程序结束。

更改缓冲模式

可以使用 setvbuf() 函数来更改标准输出流的缓冲模式,示例代码如下:

#include <stdio.h>

int main() {
    // 设置标准输出为无缓冲模式
    setvbuf(stdout, NULL, _IONBF, 0);
    printf("This message will be printed immediately.\n");
    return 0;
}

代码解释:在上述代码中,setvbuf(stdout, NULL, _IONBF, 0) 将标准输出流设置为无缓冲模式,因此 printf() 函数输出的内容会立即显示在屏幕上。

相关文章:

  • Java 基于 SpringBoot+Vue 的动漫平台(附源码,文档)
  • 嵌入式开发:接触器
  • 安卓burp抓包,bypass ssl pinning
  • 同步异步日志系统-日志落地模块的实现
  • 基于 Python typing 模块的类型标注
  • 容器化部署Kafka的最佳实践:基于KRaft模式的无ZooKeeper方案
  • spring如何解决循环依赖
  • 机器学习--逻辑回归
  • 烧烤炉出口亚马逊欧盟站CE认证EN1860安全标准
  • Game Maker 0.11:《The Sandbox》创作愿景的全新篇章
  • 软件评测师复习之计算机网络(4)
  • VScode运行后出现黑窗口
  • 页表是如何工作的
  • 【CSS】部分div禁用tailwindcss
  • 零基础入门机器学习 -- 第八章无监督学习与聚类
  • Android 13 上通过修改 AOSP 拦截 SystemUI 音量调节事件
  • Codeforces Round 1005 (Div. 2)(A-D)
  • kong身份认证插件详解之Basic Auth插件
  • 【Linux】--- 信号阻塞、信号捕捉
  • thingboard告警信息格式美化
  • 重庆公共资源交易中心网/seo工具下载
  • 深圳网站建设中心/百度seo引流怎么做
  • webstack wordpress模板/北京seo多少钱
  • 专业营销的网站建设公司排名/太原seo哪家好
  • 提供网站制作公司电话/seo优化的方法有哪些
  • 北京网站建设价格低/今天刚刚发生的重大新闻