【C语言小知识】缓冲区

简介: 【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 没有提供调用无缓冲输入的标准方式,这意味着是否能进行无缓冲输入取决于计算机系统。

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

相关文章
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
7月前
|
存储 C语言 C++
C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)(下)
C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)
80 0
|
7月前
|
存储 C语言 C++
C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)(上)
C语言进阶⑲(文件下篇)(文件读写+文本文件和二进制文件+EOF+文件缓冲区)
62 0
|
存储 缓存 C语言
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(下)
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(下)
|
编译器 C语言
【C语言航路外传】输入输出函数及输入缓冲区的那点事
【C语言航路外传】输入输出函数及输入缓冲区的那点事
49 0
|
存储 C语言
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(中)
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(中)
|
编译器 数据库 C语言
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(上)
【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识(上)
|
存储 缓存 算法
【C语言拓展】缓冲区、结构体大小计算、命令行参数
【C语言拓展】缓冲区、结构体大小计算、命令行参数
161 0
|
存储 安全 C语言
C语言实现环形缓冲区
C语言实现环形缓冲区
204 0