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

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 00:12:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 00:12:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 00:12:05       58 阅读
  4. Python语言-面向对象

    2024-07-13 00:12:05       69 阅读

热门阅读

  1. Gunicorn多进程指南:让Web应用跑得更快

    2024-07-13 00:12:05       21 阅读
  2. 深入探索Vite的热更新(HMR)实现

    2024-07-13 00:12:05       23 阅读
  3. springboot中抽离日志

    2024-07-13 00:12:05       18 阅读
  4. 《C++并发编程实战》笔记(一、二)

    2024-07-13 00:12:05       20 阅读
  5. 极速目标检测:算法加速的策略与实践

    2024-07-13 00:12:05       18 阅读
  6. hnust 2184: huffman编码(1)

    2024-07-13 00:12:05       23 阅读
  7. Python爬虫教程第6篇-使用session发起请求

    2024-07-13 00:12:05       19 阅读
  8. uniapp js 用dom创建form表单 并提交

    2024-07-13 00:12:05       19 阅读
  9. android 固定图片大小

    2024-07-13 00:12:05       19 阅读
  10. wifi中的PSR技术

    2024-07-13 00:12:05       21 阅读
  11. mac ssh连接工具

    2024-07-13 00:12:05       26 阅读