【C语言小知识】缓冲区

缓冲区

当我们使用printf()将数据显示在屏幕上,或者使用scanf()函数将数据输入到电脑里,我们是否会产生些许疑问?为何输入的字符会直接显示到屏幕上等等。这里需要介绍一个C语言中的一个关键概念------缓冲区。

当我们使用老式系统进行运行代码时,会出现这样一种情况:输入一个数据,会将一个数据先打印在屏幕上,然后再把处理过的一个数据打印再屏幕上。

例如:ii lliikkee yyoouu!!

像这样回显用户输入的字符后立即打印该字符是无缓冲(或直接)输入,即正在等待的程序可立即使用输入的字符。

而现在大部分系统在用户按下Enter键之前不会重复打印刚刚输入的字符,这种输入形式输入缓冲输入。

例如:i like you!

i like you!

用户输入的字符被收集并存储在一个被称为缓冲区的临时存储区,按下Enter键后,程序才可以使用用户输入的字符。

  • 该图比较了缓冲输入与无缓冲输入

为什么存在缓冲输入呢?

1.首先,把若干字符作为一个快进行传输比逐个发送这些字符节约时间。

2.如果用户打错字符,可以直接通过键盘修正错误,当最后按下Enter键后,传输的是正确的输入。

但是并不是缓冲输入比较好,在某些交互式程序中同样也需要无缓冲输入。

缓冲的分类:

缓冲分为俩类,完全缓冲I\O行缓冲I\O
完全缓冲输入 指的是当缓冲区被填满时才刷新缓冲区(内容被发送至目的地),通常出现在文件输入中。缓冲区的大小取决于系统,常见的缓冲区大小为512字节和4096字节。
行缓冲I\O指的是在出现换行符时刷新缓冲区。键盘输入通常是行缓冲输入,即在按下Enter键后才刷新缓冲区。

一般情况下,该使用缓冲输入还是无缓冲输入?

ANSI C和后续的C标准都规定输入是缓冲的,不过最初K&R把这个决定权交给编译器的编写者。

缓冲区的作用是为了提高数据传输的效率和稳定性。

缓冲区的刷新(即进行实际的I\O操作并清空缓冲区)通常会发生以下情况:

  • 缓冲区满时
  • 执行flush语句
  • 执行endl语句
  • 关闭文件

ANSI C 决定把缓冲输入作为标准的原因是:一些计算机不允许无缓冲输入。

如果计算机允许无缓冲输入,那么所用的 C 编译器很可能会提供一个无缓冲输入的选项。例如,许多 IBM PC 兼容机的编译器都为支持无缓冲输入提供一系列特殊的函数,其原型通常在 conio.h 头文件中,这些函数包括用于回显无缓冲输入的 getche()函数和用于无回显无缓冲输入的 getch()函数(回显输入意味着用户输入的字符直接显示在屏幕上,无回显输入意味着击键后对应的字符不显示)。而 Unix 系统则使用另一种不同的方式控制缓冲。

在 ANSI C 中,可以使用 setbuf()和 setvbuf()函数控制缓冲,但受限于一些系统的内部设置,这些函数可能不起作用。总之,ANSI 没有提供调用无缓冲输入的标准方式,这意味着是否能进行无缓冲输入取决于计算机系统。

缓冲区是一个存储区域,用于暂存数据,以协调不同速度的设备或操作之间的数据传输。

相关推荐
EricWang13582 分钟前
[Kimi 笔记]“面向搜索引擎”
开发语言
EricWang13582 分钟前
[kimi笔记].net平台
开发语言
William数据分析13 分钟前
【Python】常用的pdf提取库介绍对比
开发语言·python·pdf
CharonXA17 分钟前
用Python实现亚马逊Amazon高性能爬虫采集销量信息
开发语言·爬虫·python·网络爬虫·数据采集·亚马逊爬虫工具·亚马逊数据抓取
委婉待续17 分钟前
JavaScript基础
开发语言·javascript·ecmascript
711Proxy71128 分钟前
探索Python为何成爬虫开发首选
开发语言·爬虫·python
αβ³36 分钟前
C语言指针
c语言·开发语言
平生不喜凡桃李44 分钟前
浅谈strstr函数和strtok函数
c语言
語衣1 小时前
C# 子类、接口
开发语言·c#
martian6651 小时前
学懂C语言(四十):C语言 数据结构与算法详解
c语言·数据结构·算法·排序算法