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

IO进程day01(标准IO、缓存区)

目录

【1】标准IO

1》概念:

2》特点

【2】缓存区 

1》全缓存:和文件相关

 2》行缓存:和终端有关

3》不缓存:也就是没有缓存区,标准错误。


【1】标准IO

1》概念:

标准IO: 是在C库中定义的一组专门用于输入输出的函数。

 

2》特点

(1)通过缓冲机制减少系统调用,提高效率

例如:从硬盘中读1KB文件,每次只能读1B,循环读1024次。

在这个例子中,正常情况下用户通过app->系统调用接口-> 驱动程序-> 硬盘,最终进入硬盘读取数据,这样需要重复该操作1024次,效率非常低。

但通过缓冲机制,就可以在第一次进入硬盘的时候,在硬盘中拿取一个缓冲区大小的数据(可能大于要读取数据,有可能小于要读取数据),放入缓存区中,从缓存区中读取此次数据,而且剩下的1023次也都可以直接在缓存区中读取数据,相较之前,效率大大提高。

 (2)围绕进行操作,流用FILE*来表示

建立ctags索引

vi 的 ctags 使用:

(1)vi -t  查找名称

输入对应序号,回车查找

(2)继续追踪

将光标定位到要追踪的内容上,按ctrl + ],即可追踪查询

回退:ctrl + t

(3)跳转到上次的位置:ctrl + o

         跳转到下次的位置:ctrl + i

vscode的ctags使用

鼠标定位到要追踪的内容上:ctrl 左键

前后跳转:

跳转到上次的位置:ctrl alt -

跳转到下次的位置:ctrl shift -

 (3)标准IO默认打开三个流  stdin(标准输入)stdout(标准输出) 和  stderr(标准错误)。

【2】缓存区 

1》全缓存:和文件相关

刷新全缓存:

  • 程序正常退出
  • 强制刷新:fflush(NULL);
  • 缓存区满

 2》行缓存:和终端有关

刷新标准输出缓存的条件:

  • \n
  • 程序正常退出
  • 强制刷新:fflush(NULL);
  • 缓存区满

 例:

#include <stdio.h>int main(int argc, char const *argv[])
{printf("hello world");while(1);//死循环,程序无法结束,printf语句无法打印return 0;
}

解决方法1:   \n

#include <stdio.h>int main(int argc, char const *argv[])
{printf("hello world\n");//\n刷新缓存区while(1);return 0;
}

解决方法2: 去掉while循环,让程序正常结束

#include <stdio.h>int main(int argc, char const *argv[])
{printf("hello world");//while(1);return 0;
}

解决方法3:fflush(NULL)  强制刷新

#include <stdio.h>int main(int argc, char const *argv[])
{printf("hello world");fflush(NULL);//强制刷新while(1);return 0;
}

解决方法4:当缓存区满时也会打印

例:一个缓冲区大小是1024个字节

利用循环输出打印展示  一次打印4个字节 %4d
#include <stdio.h>int main(int argc, char const *argv[])
{
for(int i = 0;i <= 256;i++)printf("%4d",i);while(1);return 0;
}

3》不缓存:也就是没有缓存区,标准错误。

perror:标准错误 会直接打印,printf :缓存区未满不会打印

#include <stdio.h>int main(int argc, char const *argv[])
{printf("hello world");perror("error");//标准错误,会直接打印while(1);return 0;
}

 

 练习:计算标准输出缓存区大小 KB

利用结构体指针stdout

#include <stdio.h>int main(int argc, char const *argv[])
{printf("buf:");printf("%ld\n",stdout->_IO_buf_end - stdout->_IO_buf_base);return 0;
}

综上:当我们每次要在终端打印数据时,并不是将数据直接发送给标准输出设备,也就是并直接发送给显示器,而是将要打印的数据先存放到缓存区,当缓冲存数据满时,或者遇到\n,或者程序结束时,或者手动刷新缓存区时,缓冲区才会把数据传输到标准输出设备中,也就是显示器中进行输出。但是全缓存不能用\n刷新缓存


今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 51单片机最快能生成多高频率的方波?
  • 趣味算法------试用 6 和 9 组成的最大数字
  • flutter 动画
  • 软件测试学习笔记丨Chrome开发者模式
  • [Day 65] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • Neo4j导入csv数据,并创建节点
  • Vue3 pinia
  • C++设计模式6:适配器模式
  • 使用GitHub Actions的Self-hosted runner
  • leetcode541:反转字符串II
  • io进程----文件io
  • 8月27日,每日信息差
  • 【深度学习】爱因斯坦求和约定
  • STM32 - 笔记3
  • 最新网站服务器CC压力测试系统源码
  • 【node学习】协程
  • 【翻译】babel对TC39装饰器草案的实现
  • 【前端学习】-粗谈选择器
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • JavaScript服务器推送技术之 WebSocket
  • Java多线程(4):使用线程池执行定时任务
  • python3 使用 asyncio 代替线程
  • Swift 中的尾递归和蹦床
  • text-decoration与color属性
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue-router的history模式发布配置
  • vuex 学习笔记 01
  • 关于extract.autodesk.io的一些说明
  • 探索 JS 中的模块化
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 湖北分布式智能数据采集方法有哪些?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #QT(智能家居界面-界面切换)
  • #传输# #传输数据判断#
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (+4)2.2UML建模图
  • (003)SlickEdit Unity的补全
  • (13):Silverlight 2 数据与通信之WebRequest
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (39)STM32——FLASH闪存
  • (4) PIVOT 和 UPIVOT 的使用
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础1
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)树状数组
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Mobi域名介绍
  • .NET 4.0中的泛型协变和反变