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

news2024/11/15 17:50:58

目录

【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刷新缓存


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux入门——10 信号

1.信号 1.信号------信号量&#xff08;两者没有任何关系&#xff09; 2.信号讲什么----->整个信号的生命周期 信号的产生-----信号的保存------信号的处理 之前的kill命令&#xff0c;用的就是信号。 kill -l查看系统支持的信号 名字本身就是宏&#xff0c;其实就是编…

java—1 封装

目录 一、零碎内容 一、输入、输出 二、idea项目结构 三、Java标识符的命名规范&#xff08;约定俗成&#xff09; 四. 方法和函数 二、快捷键 三、数组 1. 声明数组 2. 静态初始化 3. 数组动态初始化 4. 声明和初始化一起完成 5. 数组地址 四、面向对象编程 1. …

进程函数练习

创建子父进程&#xff0c;子进程将1.txt内容拷贝到2.txt中&#xff0c;父进程将3.txt内容拷贝到4.txt中。 #include <myhead.h>int main(int argc, const char *argv[]) {pid_t ID;ID fork();if(ID>0)//父进程{printf("父进程ID:%d\n",ID);int fd open(&…

C HTML格式解析与生成

cmake报错替换 if(NOT MyHTML_BUILD_WITHOUT_THREADS OR NOT MyCORE_BUILD_WITHOUT_THREADS) set(CMAKE_THREAD_PREFER_PTHREAD 1) if (WIN32) set(CMAKE_USE_WIN32_THREADS_INIT ON) set(CMAKE_THREAD_PREFER_PTHREADS TRUE) set(THREADS_PR…

Covalent Network(CXT)第二季度委托激励增长83%

Covalent Network&#xff08;CXT&#xff09;是一家领先的区块链数据解决方案供应商&#xff0c;拥有超过 230 条链的集成和数十亿个结构化数据点&#xff0c;专注于去中心化应用&#xff08;dApps&#xff09;和长期数据可用性。Covalent Network&#xff08;CXT&#xff09;…

C语言 之 整数在内存中的存储、大小端字节序和字节序的判断

文章目录 整数在内存中的存储大小端字节序和字节序判断大小端有大小端的原因高位和地位怎么区分&#xff1f;图例判断机器大端还是小端的例题 整数在内存中的存储 整数的2进制表示方法有三种&#xff0c;即 原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c…

DHCP DNS 欺骗武器化——实用指南

DHCP 枚举 在我们之前的文章中,我们分享了 DHCP DNS 欺骗背后的理论。实际上,需要几条信息才能有效地执行我们描述的攻击。对于攻击者来说幸运的是,发现DHCP 服务器并了解其配置的能力是 DHCP 协议的一部分,这使得侦察过程变得微不足道。 在以下章节中,我们将描述攻击者…

基于华为昇腾910B和LLaMA Factory多卡微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

PostgreSQL 与对象存储的结合: 在 MinIO 中访问外部数据

数据领域最激动人心的发展之一是湖仓一体功能在所有主要数据库供应商中的兴起。Snowflake 和 SQL Server 长期以来一直采用这一点&#xff0c;现在 PostgreSQL 正在通过 pg_lakehouse 拥抱这种范式转变&#xff0c;使得利用现代数据湖进行分析、AI 等比以往任何时候都更容易。随…

【Java 搜索二维矩阵 I II,多数元素 I II,分治法 二分法 摩尔投票法】

搜索二维矩阵 I II&#xff0c;多数元素&#xff0c;分治法 & 二分法 & 摩尔投票法 题目1&#xff1a;力扣-搜索二维矩阵[https://leetcode.cn/problems/search-a-2d-matrix/description/](https://leetcode.cn/problems/search-a-2d-matrix/description/)分治-排除法分…

了解精密零部件加工制造的关键技术

在现代工业领域中&#xff0c;精密零部件的加工制造起着至关重要的作用。从高端电子设备到航空航天领域&#xff0c;都离不开高精度的零部件。时利和详细解析了解精密零部件加工制造的关键技术&#xff0c;对于推动工业发展的重要性。 高精度的加工设备是实现精密零部件制造的基…

嬴图 | 从数据到智能,解密物流业的“智慧大脑”——图数据库的颠覆性力量

前言 早在3000年前&#xff0c;古埃及、希腊、罗马就开始利用航运系统开启了物资运输和分配&#xff0c;并形成了奥斯提亚、亚历山大港等古代超级物流中心&#xff1b;而在古中国和古印加&#xff0c;完善的驿站系统又将物资、人员、供给等方面进行了升级支持&#xff0c;从制…

MATLAB进阶:矩阵代数

今天我们学习矩阵在MATLAB中的运算。 运算符 与数组运算相同&#xff1a; A. ’转罝 A’&#xff08;共轭&#xff09;转罝 共轭转置&#xff08;A’或A†&#xff09;&#xff1a; 对于一个复数矩阵A&#xff0c;其共轭转置记作A’或A†。共轭转置不仅将矩阵A的行和列互…

用于超声电影中同时检测关键帧和地标的贝叶斯网络| 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用

Title 题目 A Bayesian network for simultaneous keyframe and landmark detection inultrasonic cine 用于超声电影中同时检测关键帧和地标的贝叶斯网络 01 文献速递介绍 超声电影&#xff08;Ultrasonic cine&#xff09;是超声检查中常见的保存形式&#xff0c;允许实…

ComsolMatlab 可扩展设计的高效低频阻抗调制声学超材料

参考文献&#xff1a;Zeng K, Li Z, Guo Z, et al. Acoustic metamaterial for highly efficient low-frequency impedance modulation by extensible design[J]. Extreme Mechanics Letters, 2022, 56: 101855. 我们提出了一种创新的低频宽带高效吸声材料&#xff0c;其设计原…

基于Kotlin Multiplatform实现静态文件服务器(五)

Netty简介 Netty 是一个利用 Java 的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 文件服务 文件服务基于Netty框架实现&#xff0c;关于Netty&#xff0c;可以了解&#xff1a;https://netty.io/。 class BootStrapServe…

“购物也能赚钱?‘随机返利‘模式颠覆你的消费体验!“

近期&#xff0c;关于“消费即享随机返利”的话题在张三与李四之间频繁提及&#xff0c;这一新颖的消费机制究竟是何方神圣&#xff1f; 实质上&#xff0c;它并非某种实体物品&#xff0c;而是一种创新的营销策略&#xff0c;旨在促进商品销售。去年&#xff0c;一位精明的商家…

【25届秋招】饿了么0817算法岗笔试

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/17 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;100min 本试卷还有单选和多选部分&#xff0c;但这部分比较简单就不再展示。 最近终于有时间继续整理之前的笔试题了&#xff0c;因为时间仓促…

Gartner发布2024年终端和工作空间安全成熟度曲线:24项相关技术发展和应用状况及趋势

由于攻击者使用人工智能来增强网络钓鱼和终端攻击&#xff0c;企业需要高级安全措施来阻止入侵行为。此技术成熟度曲线可帮助安全和风险管理领导者识别可增强终端和工作空间保护的技术。 需要知道什么 网络安全创新层出不穷&#xff0c;但区分真正的进步与短暂的趋势却很困难。…

如何在Python中使用IP代理

在网络爬虫、数据抓取等应用场景中&#xff0c;使用IP代理可以有效避免IP被封禁&#xff0c;提高爬取效率。本文将详细介绍如何在Python中使用IP代理&#xff0c;帮助你在实际项目中灵活应用。 准备工作 在开始之前&#xff0c;你需要准备以下工具和资源&#xff1a; Python环…