C语言中的输入输出流和缓冲区(重点)详解

2023-05-16

导读:

C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。

scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。
printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度
输出控制。 C语言借助了相应的缓冲区来进行输入与输出。
在这里插入图片描述
如上的简图 ̄□ ̄|| OK,我们接下来进入正题:

1. 流是什么?

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bit,byte,packet )的抽象描述。

“流”:是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。  

   
   
   
   

    它的特性是:有序连续、具有方向性。

    2.对输入输出缓冲区的理解:

    
    1.为什么要引入缓冲区
    

      例如,我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

      又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。

      现在您基本明白了吧,缓冲区就是一块内存区, 它用在输入输出设备和CPU之间,用来缓存数据 。它 使得低速的输入输出设备和高速的CPU能够协调工作 ,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

      
      2.缓冲区的类型
      

        缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。

        1. 全缓冲

        在这种情况下,当 填满 标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是 对磁盘文件的读写 。

        1. 行缓冲

        在这种情况下,当在输入和输出中遇到 换行符 时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等 按下回车键换行 时才进行实际的I/O操作。典型代表是 标准输入(stdin) 和 标准输出(stdout) 。

        1. 不带缓冲

        也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

        
        3.缓冲区的大小
        

          如果我们没有自己设置缓冲区的话,系统会默认为标准输入输出设置一个缓冲区,这个缓冲区的大小通常是 512个字节 的大小。

          缓冲区大小由 stdio.h 头文件中的宏 BUFSIZ 定义,如果希望查看它的大小,包含头文件,直接输出它的值即可:printf("%d", BUFSIZ);

          缓冲区的大小是可以改变的,也可以将文件关联到自定义的缓冲区,详情可以查看 setvbuf()和 setbuf() 函数。

          
          4.缓冲区的刷新(清空)
          

            下列情况会引发缓冲区的刷新:
            缓冲区满时 ; 行缓冲区遇到回车时 ; 关闭文件 ; 使用特定函数刷新缓冲区 。

            
            5.结合缓冲区深度谈谈C语言getchar()
            

              先来看一下 getchar() ,其原型为: int getchar(void);

              当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,getchar()函数 才开始从键盘缓冲区中每次读入一个字符 。也就是说, 后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键 。打个比方,键盘缓冲区就像是一条水管连着你的程序,程序调用getchar()函数用户输入字符就相当于往水管里注水,这个水注多少取决于你输入多少,当你按回车停止注水时,getchar()函数才会开始从键盘缓冲区,也就是我们的水管里取水,那每次只会读一个字符也就是每次取一定量的水,当你在这之后继续调用getchar()函数时,会接着在水管里取上次没用完的水,因为你的水管没清空(缓冲区的刷新),那这个阶段就不用你再输入了,因为一调用getchar()函数就有水可取嘛,直到水管里没水了,你还调用getchar()函数,那这个时候你就得注水了也就是程序会等你按键。

              通俗一点说,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
              getchar()函数的执行就是采用了行缓冲。第一次调用getchar()函数,会让程序使用者(用户)输入一行字符并直至按下回车键 函数才返回。此时用户输入的字符和回车符都存放在行缓冲区。再次调用getchar()函数,会逐步输出行缓冲区的内容。

              请看下边这个例子:
              在这里插入图片描述
              运行结果如下:
              在这里插入图片描述
              再把程序做微小改变:
              在这里插入图片描述

              运行结果:
              在这里插入图片描述
              上面第二次打印时不是2而是空格,你应该想到为什么了吧?读者可以结合上文再多思考。

              总结:
              以上就是这篇文章的全部内容了,希望可以对大家的学习具有一定的参考学习价值,如果有疑问大家可以留言交流。

              本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

              C语言中的输入输出流和缓冲区(重点)详解 的相关文章

              • YOLO-V1至YOLO-V4学习笔记

                YOLO学习笔记 YOLO学习笔记一 YOLO V1二 YOLO V2 xff1a 三 YOLO V3 xff1a 四 YOLO V4 xff1a YOLO学习笔记 一 YOLO V1 针对对FasterR CNN改进 xff0c 取消了区
              • 【记录+解决】ubuntu服务器显卡驱动安装;Ubuntu20.04重启后找不到Nvidia显卡驱动

                记录ubuntu服务器显卡驱动安装 一次ubuntu服务器显卡驱动安装历程 xff0c 简单记录 1 下载Nvidia Linux驱动到本地 Nvidia Linux XXX run 2 停用桌面 xff0c 安装驱动 span class
              • 【解决】ubuntu桌面无法进入问题

                ubuntu桌面崩溃 xff0c 无法进入 记录一次ubuntu桌面崩溃无法进入系统桌面问题的解决 xff0c 无法进入桌面 xff0c 但可以进入终端的情况下可以参考解决 span class token comment 进入终端 spa
              • jetson tx2安装opencv

                Jstson TX2 安装opencv 参考 xff1a https blog csdn net QLULIBIN article details 84072356 版本 xff1a Jetson TX2JetPack3 2OpenCV3
              • C++符号修饰Name-mangling

                C 43 43 符号修饰 C语言符号修饰 在上古时期 xff0c 编译器编译源代码产生目标文件时 xff0c 符号名与相应的变量和函数的名字是一样的 比如一个汇编源代码里面包含一个函数foo xff0c 那么汇编器将其编译成目标文件后 xf
              • VS Code远程SSH免密登录配置

                最近更新了VS Code之后 xff0c 发现Remote ssh拓展里的端口转发功能没了 xff0c 很伤心 xff0c 在探索的同时 xff0c 顺手配置了一下VS Code ssh免密登录 xff0c 以省去每次连接远程文件夹时输入两
              • 目标检测之一(传统算法和深度学习的源码学习)

                目标检测之一 xff08 传统算法和深度学习的源码学习 xff09 本系列写一写关于目标检测的东西 xff0c 包括传统算法和深度学习的方法都会涉及到 xff0c 注重实验而不着重理论 xff0c 理论相关的看论文去哈 xff0c 主要依赖
              • FreeRTOS中任务切换过程的分析

                FreeRTOS中Pendsv任务切换过程的分析 一 Pendsv中断任务解析 xff08 1 xff09 uxCriticalNesting 是进入临界区的次数 xff08 2 xff09 pxCurrentTCB是FreeRTOS运行时
              • CentOS6关闭防火墙使用以下命令

                cmd命令关闭防火墙 net stop mpssvc CentOS6关闭防火墙使用以下命令 xff0c 临时关闭 service iptables stop 禁止开机启动 chkconfig iptables off CentOS7中若使用
              • 《软件工程》试题举例-简答题

                Please give out 3 pieces of recommendations regarding language independent good programming practice 6 marks 良好的编程实践的建议
              • 2020届电子信息类专业保研经历分享

                文章目录 一 个人基本情况二 初心三 夏令营 九推情况介绍1 上海交大自动化系直硕面试 xff08 7月8日 xff09 2 中科大信息学院夏令营 xff08 7月15日 xff09 3 中科院自动化所夏令营 xff08 7月23日 xff
              • RGB图与灰度图相互转换关系表达式

                RGB图转灰度图 1 Y 61 0 3R 43 0 59G 43 0 11B 2 平均值法 xff0c 将RGB平均 灰度图转RGB图 先将单通道的灰度图转为三通道的RGB图 xff0c 各通道值的初值赋值为与灰度值相同 然后按照下式映射关
              • sklearn包导入错误:ImportError: cannot import name ‘Type‘解决办法

                在python3 5环境下使用pip直接安装sklearn包后 xff0c 导入出现如下错误 xff1a 仔细观察报错信息可以发现 xff0c 出错的是sklearn中使用到的scipy包 单独导入scipy包发现出错 xff1a 看来 x
              • PyTorch Dataloader报错ValueError: num_samples的另一种可能原因

                先粘报错信息 xff1a Traceback most recent call last File train py line 169 in train test File train py line 29 in train test da
              • Focal loss变种汇总

                VariFocal loss 只对负样本做难易样本挖掘 xff08 正样本数量少 xff0c 不做loss压缩 xff09 Generalized Focal loss xff1a quality focal loss 43 distrib
              • 视觉Transformer中的位置编码方式

                绝对位置编码 基本形式 xff1a x 61 x 43 p 可学习的绝对位置编码 xff08 ViT xff09 ViT中提出的位置编码方式简单粗暴 xff0c 设置一组可学习的编码tokens xff0c 并在patch embeding
              • 秋招问题汇总

                1 Python变量作用域 xff1a 局部作用域 xff08 Local xff0c 简写为 L xff09 作用于闭包函数外的函数中的作用域 xff08 Enclosing xff0c 简写为 E xff09 全局作用域 xff08 G
              • 38、OpenCV之C++教程

                一 OpenCV的下载与安装 下载完成后会得到一个 opencv 3 4 15 vc14 vc15 exe 文件 点击运行后会生成一个文件夹 此文件夹为下一步工程创建使用 xff0c 文件夹可移动 复制和重命名 xff0c 这里命名如下 x

              随机推荐

              • Java大数据之路--HDFS详解(3)--基本命令

                HDFS 分布式文件存储系统 基本命令 目录 HDFS 分布式文件存储系统 基本命令 一 常见命令 二 其他命令 一 常见命令 命令 说明 hadoop fs mkdir park 在hdfs 的根目录下 xff0c 创建 park目录 h
              • C# 连接 SqlServer 数据库

                目录 一 创建表 二 给表添加数据 三 新建 C 项目 四 SqlServerHelper 五 连接数据库 一 创建表 首先 xff0c 新建一个数据库 Test xff0c 然后新建一个表 Users xff0c 字段名如下图 xff0c
              • org.xml.sax.SAXParseException的错误解决 2020-11-20

                span class token number 2020 span span class token operator span span class token number 11 span span class token operat
              • JS如何优雅的删除对象中的指定属性?

                要优雅的话 xff0c 使用 Lodash 的 omit 方法移除不要的属性 xff1a const object 61 a 1 b 2 c 3 const result 61 omit object a c 61 gt b 2 或者用 p
              • python 使用 isdigit 判断字符串中是否只由数字组成

                span class token operator span span class token operator span span class token operator span span class token operator s
              • 快速排序详解(Java实现)

                一 快速排序的基本思想 每一轮的排序都会将区域分割成两个独立的分区 xff0c 其中左分区的序列的所有值均会比右分区的所有值小 然后对子分区进行同样的分割操作 xff0c 最后达到整体有序 在排序的过程中 xff0c 由于已经分开的两部分的
              • A*算法路径规划之Matlab实现

                A 算法路径规划之matlab实现 A 算法是一种传统的路径规划算法 xff0c 相较于Dijkstra算法 xff0c 其引入了启发式算子 xff0c 有效的提高了路径的搜索效率 主要步骤包括 xff1a 1 xff09 设置起始点 目标
              • C语言中‘a‘和“a“有什么区别?

                1 本质区别 双引号里面的是字符串 xff0c 而单引号里面的代表字符 2 输出区别 str 61 a 输出的就是a这个字母 xff1b str 61 a 输出的测试65 3 底层区别 用单引号引起的一个字符实际上代表一个整数 xff0c
              • linux VNC客户端登陆失败

                vnc登陆出现 Unknown authentication scheme from VNC server 解决办法 xff08 建议在做操作之前重启vnc server xff0c 密码输错过多可能导致一直连接失败 xff09 https
              • win 10 mstsc连接 RemoteApp

                本文是关于mstsc客户端的配置 xff08 服务端的配置本文不描述 xff09 xff0c 前提是服务端配好 xff0c 知道RemoteApp怎么玩的 windows 2008 的mstsc有个配置 xff0c 关于程序 的tab页 但
              • 贪心算法的改进

                关于贪心算法 xff0c 请看我的上一篇博客 解决贪心算法的复杂度 为解决贪心算法的复杂度 本文提出 xff1a 通过分解极大联通子图去寻找影响力最大的节点的算法 强连通 xff1a 在有向图G中 xff0c 如果任意两个不同的顶点相互可达
              • 非关系型数据库-redis应用场景

                关系型数据库与非关系型数据库 redis的应用场景 xff1a 1 redis由于数据的读取和操作都在内存当中操作 xff0c 读写的效率较高 xff0c 所以经常被用来做数据的缓存 把一些需要频繁访问的数据 xff0c 而且在短时间之内不
              • Linux创建用户后,登录报错/usr/bin/xauth: file /home/user/.Xauthority does not exist

                错误信息如下 usr bin xauth span class token function file span home user Xauthority does not exist 错误原因 是因为添加用户时没有授权对应的目录 xff0
              • VSCode测试ES6语法

                一 VsCode使用 1 1 VsCode基本操作 Alt 43 Shift 43 F格式化代码 二 ES6新特性 2 1 let声明常量 2 2 const声明常量 只读变量 2 3 解析表达式 2 3 1 数组解构 2 3 2 对象解构
              • VNC远程连接树莓派报错问题解决(文末有惊喜呦)

                用VNC远程连接树莓派 xff0c 出现拒绝连接 问题原因 xff1a 只设置了PC端的服务器 xff0c 但是没有在树莓派端开端口 解决办法 xff1a 用putty或者xshell连接树莓派 xff0c 输入命令 xff1a vncse
              • ReadFile函数

                函数功能 xff1a 该函数从文件指针指示的位置开始从文件读数据 xff0c 在读操作完成后 xff0c 如果文件句柄不是用重叠属性来创建 xff0c 则文件指针用实际读的字数来调整 如果文件句柄为重叠的输入和输出 xff08 I O xf
              • error MSB8041: 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。

                最近新安装了vs2019企业版 xff0c 用vs打开vs2015的工程出现如下错误 xff1a error MSB8041 此项目需要 MFC 库 从 Visual Studio 安装程序 单个组件选项卡 为正在使用的任何工具集和体系结构
              • PC和Android模拟器之间虚拟串口通信

                前言 很多时候我们在做串口通信的时候需要去模拟串口来调试 xff0c 这样可以极大的方便我们的工作 xff0c 不然的话可能需要连接硬件设备 xff0c 比较麻烦 一般情况下我们先在电脑上模拟串口后初步调试 xff0c 最后阶段在硬件设备上
              • 【C语言】将正数转成负数,将负数转成正数

                将正数转成负数 xff0c 将负数转成正数 include lt stdio h gt int change int num if num lt 0 num 61 num 1 else if num gt 0 num 61 num 43 1
              • C语言中的输入输出流和缓冲区(重点)详解

                导读 xff1a C语言中我们用到的最频繁的输入输出方式就是scanf 与printf scanf xff1a 从标准输入设备 键盘 读取数据 xff0c 并将值存放在变量中 printf xff1a 将指定的文字 字符串输出到标准输出设备