侵权投诉

探索C语言入门基础之缓冲区

Android编程精选 2021-06-28 17:24 次阅读

01

C标准库缓冲区探索

计算机里缓存是一个很重要的概念,C标准库里大量使用了缓存,最为典型的就是标准输入和标准输出的缓存,关于C语言的输入和输出看这篇文章即可,利用好缓存可以大幅提高程序性能,首先我们看一下下面这段代码会输出什么?

#include 《stdio.h》 #include 《unistd.h》 int main() { printf(“Hello World!”); //往标准输出输出字符串 //程序停留在while循环里,程序退出会强制刷新缓冲区数据 while(1){ sleep(1); } return 0; }

我们在程序里调用printf函数打算在标准输出“Hello World!”,下面的while(1)循环是想让程序停在这里不退出程序,每次睡眠1s避免占用大量CPU资源,在Linux中包含unistd.h头文件才能使用sleep函数。现在我们编译以下看看会输出什么?

ce807804-d751-11eb-9e57-12bb97331649.png

我们看到,其实什么都没有输出。但是从程序上看,我们已经调用了printf函数往标准输出输出字符串,这就是缓存在起作用了。printf函数默认是行缓冲,当输出字符串里有 或者行缓冲区被填满或者手动调用fflush函数才会一次性将数据输出。现在你只要加上一条语句输出换行符,就能在标准输出输出字符串了。

printf(“ ”); //换行,默认标准输出会立即输出刷新缓冲区

或者我们手动调用fflush也可以强制刷新缓冲区,输出字符串。

fflush(stdout); //强制刷新标准输出缓冲区

往标准错误输出字符串的语句编译运行后会发生什么呢?

fprintf(stderr, “error information”); //往标准错误输出输出信息

fprintf函数将信息往第一个FILE指针类型参数输出,这里第一个参数我们传入stderr,编译运行后立即在控制台上输出字符串“error information”。标准错误输出和标准输出运行测试结果对比我们知道,调用fprintf函数往标准错误输出信息时不需要加字符‘ ’,也不需要强制刷新缓冲区也能立即输出信息。这是因为标准错误输出是无缓冲模式,写入什么数据就立即输出什么数据。

下面我们再看看输入代码

#include 《stdio.h》 int main() { char arr[100] = {0}; scanf(“%s”, arr); return 0; }

在这段代码里,程序运行后我们从标准输入输入数据,直到按下回车才将数据输入到数组arr里。在按下回车后,实际上刷新了输入缓冲区将数据一次性写入到数组arr里。

03

缓冲区的作用

在计算机里应用程序调用一个系统调用从用户态进去内核态再将结果回到用户态开销较大。如果我们调用printf函数,每次输出一个字符都要从用户态切换到内核态,那么连续输出多个字符开销成本将会非常大,这个时候缓存就起到非常大的作用了,输出的字符串先在应用程序里缓存起来,缓存到一定数量后再调用系统调用一次性将缓存数据输出到标准输出。

由于只调用了一次系统调用,比连续调用多个系统调用性能高上不少。在生活中我们也能感受到缓存带来的效率提升,打个比方你办公室有一个垃圾桶,楼下有倒垃圾的地点,如果扔一个垃圾到垃圾桶里我们就拿去倒掉,将会在办公室和楼下之间来回很多趟,浪费大量时间。如果将垃圾桶装满,再一次性拿到楼下倒掉,只需要跑一次就能把垃圾全都倒掉,节省了时间,提高了效率。

04

缓冲模式和使用方式

C语言里有行缓冲模式、全缓冲模式和无缓冲模式。

行缓冲模式:填满缓冲区或者有换行符‘ ’或者调用fflush函数强制刷新缓冲区会立即输出。

全缓冲模式:填满缓冲区或者调用fflush函数强制刷新缓冲区会立即输出。

无缓冲模式:写入什么数据就会立即输出什么数据,例如标准错误输出默认的缓冲模式。

下面我们用实际代码演示如何使用三种缓冲模式,设置缓冲模式会用到setvbuf函数,我们先来看看setvbuf函数声明。

/* Make STREAM use buffering mode MODE. If BUF is not NULL, use N bytes of it for buffering; else allocate an internal buffer N bytes long. */ extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) __THROW;

第一个参数是FILE类型指针,第二个参数是外部缓冲区指针,第三个参数是缓冲模式,第四个参数是缓冲大小,如果不使用外部缓冲区,函数内部将会调用malloc申请一块内存作为内部缓冲区。

形参mode提供了三个参数分别设置不同的缓冲区模式

_IONBF unbuffered _IOLBF line buffered _IOFBF fully buffered

无缓冲模式实例代码

#include 《stdio.h》 #include 《unistd.h》 int main() { setvbuf(stdout, NULL, _IONBF, 0); //标准输出设置为无缓冲,不使用外部缓冲区 printf(“Hello World!”); return 0; }

编译运行会立即输出

Hello World!

行缓冲模式实例代码

#include 《stdio.h》 #include 《unistd.h》 int main() { setvbuf(stdout, NULL, _IOLBF, 0); //标准输出设置为行缓冲模式,不使用外部缓冲区 printf(“how are you”); //不会立即输出字符串 fflush(stdout); //强制刷新缓冲区,立即输出字符串 return 0; }

编译运行后,由于调用了fflush会强制刷新数据到标准输出。

全缓冲模式实例代码

#include 《stdio.h》 #include 《unistd.h》 int main() { setvbuf(stdout, NULL, _IOFBF, 0); //标准输出设置为全缓冲模式,不使用外部缓冲区 printf(“Hello World!”); //不会立即输出 printf(“how are you”); //不会立即输出 printf(“ ”); while(1){ sleep(1); } return 0; }

编译运行后发现没有任何输出,现在我们在while循环前面加上下面这条语句,编译运行看看。

fflush(stdout); //强制刷新缓冲区

编译运行后立即输出了字符串!

同样的使用方式可以用于标准输入和标准错误输出,只需要把stdout缓存stdin或者stderr即可。

编辑:jq

原文标题:C语言入门基础之缓冲区

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

北鲲云超算平台加快药物研发进程

近年来高新技术迅速发展,以医药研究领域为例,传统的研究方法和手段已经发生了巨大变化,许多药物研发企业....
发表于 09-18 16:56 66次 阅读

景区生态环境监测站的特点

景区生态环境监测站的系统组成介绍FT-FYLZ【风途】负氧离子不仅是衡量大气环境质量的天平,而且本身....
发表于 09-18 16:38 10次 阅读

油脂酸价测定仪有什么优势

油脂酸价测定仪【莱恩德】为集成化油品快速检测分析设备,能够快速检测食用植物油、食用猪油、花生油、葵花....
发表于 09-18 14:21 35次 阅读

蔬菜农药残留快速检测仪使用

蔬菜农药残留快速检测仪【莱恩德】守卫顾客的消费安全性。蔬菜的产品质量是否关联到顾客的就餐安全性,以往....
发表于 09-18 14:12 36次 阅读

MSK调制解调器的matlab仿真

继续讲解程序!MSK也能进行相干解调?是的!同样是采用锁相环!先来看看MSK的优点,这是由于下面的这....
的头像 通信工程师专辑 发表于 09-18 11:43 102次 阅读
MSK调制解调器的matlab仿真

介绍3种方法跨时钟域处理方法

跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者....
的头像 FPGA设计论坛 发表于 09-18 11:33 612次 阅读
介绍3种方法跨时钟域处理方法

机智云追踪外卖骑手保温箱硬件开发和项目演示

01 本章实现功能介绍 追踪外卖骑手的保温箱的GPS定位信息以及外卖箱是否被人打开,以防止骑手在送餐....
的头像 机智云开发者 发表于 09-18 11:03 103次 阅读

如何充分利用各种类型的断点

代码断点是最简单的断点。开发人员只需要选择C代码或者反汇编窗口中的ASM指令并设置断点即可。一旦断点....
发表于 09-18 11:03 613次 阅读
如何充分利用各种类型的断点

深入探究Linux系统噪音统计(osnoise tracer)

在Linux系统中作为一个普通线程是非常苦逼的。不仅NMI 、硬中断、软中断可以打断它,甚至其它普通....
的头像 Linux阅码场 发表于 09-18 10:53 143次 阅读
深入探究Linux系统噪音统计(osnoise tracer)

是德科技与联发科技实现6Gbps数据吞吐速度

密切协作助力移动运营商以独立模式高效部署先进的5G 服务。 2021年9月6日,北京――是德科技公司....
的头像 是德科技快讯 发表于 09-18 10:42 773次 阅读

如何解决企业的数据之痛

企业的数据之痛 企业的数据之痛源⾃于企业的数据处理能⼒和数据增⻓速度的不匹配。根据知名分析机构的估算....
的头像 IBM中国 发表于 09-18 09:53 91次 阅读

ZN-105计算机的微机接口及应用部分有哪些

ZN-105计算机的组成原理是什么? ZN-105计算机的微机接口及应用部分有哪些? ...
发表于 09-18 08:57 0次 阅读

avr单片机INT0是如何去模拟代码的

avr单片机INT0是如何去模拟代码的?怎样去编写其代码?...
发表于 09-18 06:49 0次 阅读

名片全能王,帮助职场人士轻松社交

在职场中,人与人之间的交际是最基本的环节。如何在初次见面时就给对方留下一个好的印象,这是一个需要考量....
的头像 话说科技 发表于 09-17 18:30 73次 阅读

蔬菜农药残留检测仪多少钱一台

蔬菜农药残留检测仪多少钱一台FT-WLK2【风途】幼儿园里的食材农药超标,对于孩子可能造成的伤害就更....
发表于 09-17 15:40 48次 阅读

家庭用的蔬菜农药残留检测仪的功能有哪些?

家庭用的蔬菜农药残留检测仪的功能有哪些?FT-WLK1【风途】农药残留是影响农产品质量安全的重要因素....
发表于 09-17 14:27 22次 阅读

C语言教程:STL-for-each算法

C语言教程:STL-for-each算法(电源技术版面费5400)-文档为C语言教程:STL-for....
发表于 09-17 12:42 2次 阅读
C语言教程:STL-for-each算法

提升企业数字化水平 这套信息化管理方案值得

相信大家对于HR既熟悉又陌生,熟悉是因为每个人入职、日常工作都会有所交集,陌生是因为大家对人力资源管....
发表于 09-17 12:27 33次 阅读

虹科合作推出小型可靠的嵌入式计算机

虹科与高性能FPGA系统开发领域的技术领跑者Gidel合作,最新推出了一款为高通量图像采集和为图像处....
的头像 广州虹科电子科技有限公司 发表于 09-17 11:17 699次 阅读

低压数据监测终端的设计特点是什么

随着科技的不断进步,我国进入新型工业化时代,用电需求量也越来越大,用电分为高压用电和低压用电。安全用....
发表于 09-17 11:12 12次 阅读

科研级全项目土壤肥料养分检测仪参数及特点

科研级全项目土壤肥料养分检测仪参数及特点JD-GT5,顾名思义,是用来检测土壤肥料的专业仪器。随着科....
发表于 09-17 11:07 21次 阅读

剖析传统步进电机转型闭环控制

电子发烧友网报道(文/李宁远)在工业自动化中,步进电机的应用非常的广泛。例如工业机器人、3D打印机、....
的头像 电子发烧友网 发表于 09-17 10:58 907次 阅读

计算机持续信号与脉冲信号区别

计算机持续信号脉冲信号区别一.计算机持续信号、脉冲信号控制强电原理、测试与故障维修(1)如图2-1所示为主电路、控制电路和计算...
发表于 09-17 09:29 0次 阅读

了解计算机硬件体系结构

模块一  知识点1.  了解计算机硬件体系结构2.  掌握常见的计算机硬件设备3.  了解计算...
发表于 09-17 09:03 0次 阅读

计算机硬盘维修与数据恢复

计算机硬盘维修与数据恢复语音编辑锁定讨论上传视频《计算机硬盘维修与数据恢复》是2006年高等教育出版社出版的图书。书名计算机...
发表于 09-17 08:54 0次 阅读

三菱交流伺服系统伺服故障和报警代码

伺服故障和报警代码大全,超实用!使用三菱交流伺服系统主要由三个系列:MR-ES、MR-J2S、MR-J3。通常故障情况可由伺服...
发表于 09-17 08:54 0次 阅读

车道计算机显示器为什么会黑屏

本文仅限于2010年收费系统改造批次设备,非此批设备有所差异,内容仅供参考。故障现象:车道计算机显示器黑屏(全屏)。原因1:电源...
发表于 09-17 07:54 0次 阅读

一种便于拆卸和安装的计算机主机箱

本实用新型涉及计算机设备技术领域,具体为一种便于拆卸和安装的计算机主机箱。背景技术:机箱作为电脑配件中的一部分,它起的主...
发表于 09-17 07:39 0次 阅读

static在c语言中是什么意思

2019-10-10阅读(64)最主要有两点用途。让一个变量长期有效,而不管其是在什么地方被申明。比如:intfun1(){staticints_value=0;....
发表于 09-17 06:42 0次 阅读

松下伺服报警代码保护功能

《松下伺服故障报警代码分析及处理》由会员分享,可在线阅读,更多相关《松下伺服故障报警代码分析及处理(2页珍藏版)》请在人人文...
发表于 09-17 06:20 0次 阅读

食品安全检测仪器设备价格介绍

近些年来,越来越多的食品安全问题被报道出来,部分不法商家为了谋取私利,不惜忽视人们的身体健康和生命安....
发表于 09-16 17:52 27次 阅读

音圈模组3D打印技术放疗治妇科癌症

音圈模组3D打印技术放疗治妇科癌症。近日,湖南省癌症医院联合放疗中心放射物理技术部先开展了“CT引导....
发表于 09-16 15:19 18次 阅读

浮标水质在线监测系统的技术参数介绍

浮标水质在线监测系统的技术参数介绍FT-SZFB【风途】根据生态环境部门监测数据显示,外沙湖5月份水....
发表于 09-16 14:17 24次 阅读

​开发板上玩GTA RISC-V多项移植项目成功运作中

电子发烧友网报道(文/周凯扬)RISC-V近期再度掀起了不小的热度,苹果招募RISC-V程序员负责其....
的头像 电子发烧友网 发表于 09-16 11:59 140次 阅读
​开发板上玩GTA RISC-V多项移植项目成功运作中

NVIDIA DRIVE平台如何用于自动驾驶汽车开发阶段

Ali Kani介绍了AI如何用于自动驾驶汽车的所有开发阶段——从训练、测试和验证汽车深度神经网络数....
的头像 NVIDIA英伟达 发表于 09-16 11:45 1108次 阅读

嵌入式开发中实用的宏打印函数

宏打印函数在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段。但是,在打印的信息....
的头像 FPGA之家 发表于 09-16 10:05 98次 阅读
嵌入式开发中实用的宏打印函数

海量数据存储的需求越来越强烈

在今天的智能社会,数据成为了最为重要的资源。根据Statista 的统计和预测,2020年全球数据产....
的头像 贸泽电子 发表于 09-16 09:45 75次 阅读

使用Kotlin替代Java重构AOSP应用

两年前,Android 开源项目 (AOSP) 应用团队开始使用 Kotlin 替代 Java 重构....
的头像 谷歌开发者 发表于 09-16 09:26 101次 阅读
使用Kotlin替代Java重构AOSP应用

Spectrum数字化仪提供的现实数据使氢燃料电池技术攀高峰

在研究中兼具成本效益和时间优势的计算机模型 德国汉斯多尔夫,2021年9月15日讯——氢燃料电池将在....
发表于 09-15 14:43 29次 阅读

魔方网表,无代码开发平台NCDP的无冕之王

NCDP也就是No-code development platform,无代码开发平台,我第一次听到....
的头像 话说科技 发表于 09-15 14:34 83次 阅读

口腔CBCT是什么,有哪些应用

随着生活水平的不断提升,我们日常饮食也在发生着变化,吃的越来越丰富,食材也越来越多样化,可是患上口腔....
发表于 09-15 09:50 484次 阅读

C语言中struct的用法有哪些

定义结构体变量       下面举一个例子来说明怎样定义结构体变量。                ....
的头像 STM32嵌入式开发 发表于 09-15 09:41 661次 阅读

51单片机的启动文件作用是什么

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示: 一般情况下,需要选择“是”....
的头像 嵌入式ARM 发表于 09-15 09:12 181次 阅读
51单片机的启动文件作用是什么

自由在云上构建全新未来——亚马逊云科技

就像亚马逊创始人Jeff Bezos所说的,“在当今动荡的时代,我们能做的就是重塑。你能拥有的可持续....
的头像 科讯视点 发表于 09-14 11:42 130次 阅读
自由在云上构建全新未来——亚马逊云科技

叶面积测定仪的使用方法

植物的生长和植物叶面积之间关系密切,叶片是植物进行光合作用的重要部分,因为植物的光合物质积累直接接受....
发表于 09-14 11:18 16次 阅读

Linux系统中图形显示方案

Linux系统中图形显示方案   1 FBDEV Framebuffer device 社区参与度不....
的头像 Linux爱好者 发表于 09-14 10:43 176次 阅读
Linux系统中图形显示方案

八种常见的数据分析方法介绍

不能度量,就无法增长。 数据分析对于企业商业价值的提升起到了至关重要的作用。在具体的业务场景中,一般....
的头像 数据分析与开发 发表于 09-14 09:44 101次 阅读

MySQL中的redo log是什么

前言 说到MySQL,有两块日志一定绕不开,一个是InnoDB存储引擎的redo log(重做日志)....
的头像 数据分析与开发 发表于 09-14 09:40 85次 阅读

影响无风扇工控机的质量因素有哪些呢?

工控机的出现让工业领域中的生产效率很大程度的提高了,为各企业分担了很大一部分的压力。随着科技的发展,....
发表于 09-13 18:02 127次 阅读

气象墒情监测站是什么

气象墒情监测站FT-TDR由于比表面积不同,导致粒径大小有差异的矿物颗粒的储水能力及储水后再供水的能....
发表于 09-13 16:30 44次 阅读

蛋白质快速检测仪的功能

随着发展,食品行业在不断的扩大生产,与此同时一些不法现象也开始出现,很多食品中蛋白质含量不合标,通过....
发表于 09-13 10:27 57次 阅读

FastThreadLocal快在哪里

blog.csdn.net/mycs2012/article/details/90898128 1 ....
的头像 Android编程精选 发表于 09-13 09:17 132次 阅读

单片机C语言程序设计实训100例电子版下载

小白可以借鉴学习
发表于 09-13 09:15 64次 阅读

计算机为什么要使用补码

人类在制造出晶体管后,利用晶体管制造出了与非门,然后又利用与非门制造出了加法器。加法器解决了加法运算....
的头像 strongerHuang 发表于 09-12 16:06 401次 阅读

C++基础语法友元类和友元函数

本期是C++基础语法分享的第五节,今天给大家来分享一下: (1)explicit(显式)关键字; (....
的头像 C语言编程学习基地 发表于 09-12 09:52 190次 阅读