详细讲解缓冲区

简介: 详细讲解缓冲区

理解回车和换行(\r&&\n)

在我们的c语言中,\n表示的是换行,可是,实际上这里的换行有两个动作:回车+换行。回车就是将光标平移到一行的最左边,换行就是光标向下平移一行。像我们键盘上的“回车键”,按下回车键后执行的是两个动作:回车+换行。

这也是为什么之前的回车键设置成这样

那如何实现单独的回车和换行呢?

\r表示回车

\r\n 存在\r时,\n表示换行

\n表示回车加换行

缓冲区

缓冲区(Buffer)是计算机科学中常见的概念,它是一块内存区域,用于存储临时数据。缓冲区的目的是在数据传输过程中缓存数据,以便更有效地处理和传递。

证明有缓冲区的存在

观察以下代码

为什么不是先打印hello再执行sleep函数呢?我们知道,c语言编译是从上往下顺序编译的,也就是说,编译器一定是先执行printf函数然后才是执行sleep函数

那为啥显示器不会马上显示printf的内容呢?

首先,显示器上能不能显示printf函数的内容,和printf函数能否执行是两码事。

也就意味着,printf函数的执行并不是直接输出到显示文件上,而是先输出到缓冲区,还没来得及从缓冲区输出到显示文件上,就执行sleep函数休眠了,这也是要等3秒才会打印出hello字符。

怎么刷新缓冲区(显示器缓冲区)?

1、程序结束的时候,一般会自动刷新缓冲区

2、缓冲区满了

3、遇到 \n 刷新前面的内容(按行刷新

4、显式调用缓冲刷新函数强制刷新(c语言中的fflush函数

fflush函数

缓冲区出现的意义

性能优化: 缓冲区可以用来提高程序的性能。通过在内存中存储临时数据,程序可以利用缓冲区进行高效的读写操作,而不必每次都直接访问慢速的外部存储设备。这对于 I/O 操作(如文件读写、网络通信)和数据库访问等场景特别重要。

临时存储: 缓冲区提供了一种临时存储数据的方式。在处理大量数据时,可以使用缓冲区来存储部分数据,而不必一次性加载整个数据集。

数据交互: 缓冲区在数据交互过程中发挥关键作用。例如,通过在网络通信中使用缓冲区,可以将大块的数据分割成小块,减少网络传输的延迟,提高效率。

I/O流

c语言中,当我们启动一个程序的时候,系统会默认给我们打开三个标准的输入输出流:stdin、stdout、stderr 当我们用fflush(stdout)的时候,就会刷新显示器文件的缓冲区

这三个流其实就是三个文件的指针,可以实现基本的用户交互。也是为什么我们能写代码、看见代码、看见报错信息。

模拟倒计时小程序来理解缓冲区

观察以下代码

for循环10-0并输出i,每次用printf输出i的时候都用fflush强制刷新,这样我们就能马上将数字i从缓冲区打印到显示器上,我们再用\r回车,使得光标再次移动到这一行的最左边,这样下次打印就会从光标处重新输出,覆盖之前的的数字。

这样一来,我们就利用缓冲区这一概念完成了一个倒计时的小程序,简洁明了。

相关文章
|
2月前
|
缓存 API C语言
文件的缓冲区
文件的缓冲区
28 1
|
2月前
|
存储 C语言
文件缓冲区
文件缓冲区
21 0
|
8月前
|
存储 网络协议 Linux
网络缓冲区
网络缓冲区
47 0
|
11月前
|
存储 缓存 数据处理
缓存与缓冲区的区别
在计算机科学中,缓存(Cache)和缓冲区(Buffer)是两个常见的概念。尽管它们的功能有些相似,但它们在实际应用中具有不同的用途和工作原理。本文将介绍缓存和缓冲区之间的区别。
402 0
|
C语言
理解缓冲区
理解缓冲区
|
算法 Java
字符串缓冲区
字符串缓冲区
107 1
|
机器学习/深度学习 索引
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
107 0
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
|
存储 缓存 Java
NIO之缓冲区【直接和非直接缓冲区】
直接与非直接缓冲区 字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。其实发现通道只接收ByteBuffer作为参数这个将Channel的时候会发现
NIO之缓冲区【直接和非直接缓冲区】
NIO之缓冲区【复制缓冲区】
复制一个缓冲区会创建一个新的 Buffer 对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据元素。我们将以 CharBuffer 为例来演示,但同样的操作可被用于任何基本的缓冲区类型。
NIO之缓冲区【复制缓冲区】