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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

suricata7 rule加载(一)加载 action

suricata7.0.5 一、前提条件 1.1 关键字注册 main | --> SuricataMain|--> PostConfLoadedSetup|--> SigTableSetupsigmatch_table是一个全局数组,每个元素就是一个关键字节点,是对关键字如何处理等相关回调函数。非常重要的一个结构&#x…

C语言牢大坠机

目录 开头程序程序的流程图《牢大坠机》&#xff08;视频正在审核中&#xff09;结尾 开头 大家好&#xff0c;我叫这是我58&#xff0c;今天&#xff0c;我们要来看关于牢大坠机的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define HIGH 66 #include <stdio.h…

ubuntu防火墙指定端口开放设置

文章目录 打开某个端口查看防火墙状态和开放端口例子 在 Ubuntu 中管理防火墙通常使用 ufw&#xff08;Uncomplicated Firewall&#xff09;。以下是打开某个端口并查看防火墙状态的方法&#xff1a; 打开某个端口 启用 ufw&#xff08;如果尚未启用&#xff09;&#xff1a; …

PyCharm如何安装requirements.txt中的依赖包

问题&#xff1a;下载别人的源码&#xff0c;如何安装代码中requirement.txt中的依赖包。 解决方案&#xff1a; &#xff08;1&#xff09;打开PyCharm下面的Terminal&#xff0c;先为代码创建单独的虚拟环境并进入到虚拟环境中&#xff08;每个项目单独的环境&#xff0c;这…

GlusterFS分布式存储系统

GlusterFS分布式存储系统 一&#xff0c;分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理&#xff0c;存储数据&#xff0c;而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长&#xff0c;单纯通过增加硬盘个数来扩展计算机文件系统的存储…

ubuntu的screen会话,断开远程连接也能照样运行程序

文章目录 创建新的 screen 会话管理 screen 会话例子关闭某一个 screen 会话删除某一个 screen 会话 在 Ubuntu 中使用 screen 工具可以创建和管理多个终端会话。以下是创建 screen 会话的方法&#xff1a; 创建新的 screen 会话 启动一个新的 screen 会话&#xff1a; screen…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…

VBA初学:零件成本统计之四(汇总计算)

第四步&#xff0c;最后进行汇总计算 汇总统计的计算 Sub count() Dim rng As Range Dim i As Long, j As Long Dim arr_s, arr, brr, crr, drr Dim rowscount As Long Dim X As Variant Dim rg As Single, xb As Single, zj As SingleMsgBox "汇总计算时间较久&#xff…

【HTML入门】第二课 - head标签下的常见标签们

目录 1 本节概要 2 head下的常见标签 2.1 网页编码设置 2.2 网页的标题 2.3 样式标签 3 head标签的内容不会显示到网页上 4 查看网页源代码 1 本节概要 上一节&#xff0c;我们说了HTML网页最基本的框架标签&#xff0c;说到标签分为head头部和body身体部分。这一小节呢…

sqlite3数据库常用的API接口

使用sqlite3的API接口 需要加头文件 #include 编译时&#xff0c;需要连接sqlite3的库 -lsqlite3 1.打开数据库文件的函数int sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */ );功能&#xff1…

Windows Server 2016 搭建 网络负载平衡 服务

网络负载平衡功能的安装 添加角色 默认不动————功能 勾选上 < 网络负载平衡 > 在工具中————打开 < 网络负载平衡管理器 > 网络负载平衡群集创建 注意 : 提前 将两台 web 站点服务器 都安装好 < 网络负载平衡功能 > 右键 选择 ————新建群集 ——…

5、RDB与AOF对比

RDB与AOF对比 1、RDB优势与不足 1.1、优势 RDB文件小 数据恢复快 1.2、不足 数据安全性较差写时复制技术会减低性能可读性较差 2、AOF优势与不足 2.1、优势 数据安全性高可读性高 2.2、不足 数据恢复较慢AOF文件较大写操作会影响性能 3、执行化技术的选型 官方推荐…

刷题——二叉搜索书的最近公共祖先

二叉搜索树的最近公共祖先_牛客题霸_牛客网 vector<int>getPath(TreeNode* root, int target) {TreeNode* node root;vector<int>path;while(node->val ! target){path.push_back(node->val);if(target < node->val)node node->left;elsenode n…

【学习笔记】爱立信SPO 1400 CRAFT软件基础知识6——配置的备份与恢复的详细方法

一、前期准备 提示&#xff1a;下面所有学习内容都是基于以下条件完成的 条件1.已经正确安装并正常运行SPO 1400 CRAFT软件&#xff08;以下简称LCT&#xff09; 条件2.确认已正确使用爱立信SPO 1400 CRAFT软件通过网络登录设备&#xff08;以下简称NE&#xff09; 具体登录…

Python通过HiperMATRIX API写数据

PyCharm编程和调试 代码片段 import random, time, requests, jsonhipermatrix_api_url http://192.168.1.240:9030/api/edge-management/equipment/7123766549772505088/write/values hipermatrix_login_url "http://192.168.1.240:9000/login/v1" send_interva…

【图解大数据技术】Flume、Kafka、Sqoop

【图解大数据技术】Flume、Kafka、Sqoop FlumeFlume简介Flume的应用场景 KafkaKafka简介Kafka架构Flume与Kafka集成 SqoopSqoop简介Sqoop原理sqoop搭配任务调度器实现定时数据同步 Flume Flume简介 Flume是一个数据采集工具&#xff0c;多用于大数据技术架构下的日志采集。 …

SQL-DCL(三)

一.DCL介绍 DCL英文全称是Data Control Language(数据库控制语言),用来管理数据库 用户,控制数据库的访问权限。 二.两个方面 1.数据库可以由那些用户访问 2.可以访问那些内容 三.DCL-管理用户 1.查询用户 USE mysql SELECT * FROM user 2.创建用户 CREATE USER…

基于Qwen2/Lllama3等大模型,部署团队私有化RAG知识库系统的详细教程(Docker+AnythingLLM)

自 ChatGPT 发布以来&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff0c;大模型&#xff09;得到了飞速发展&#xff0c;它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹&#xff0c;几乎各行各业均可从中获益。 然…

利用级数公式计算圆周率(π)

π是是指圆的周长与直径的比值&#xff0c;是无限不循环小数&#xff0c;有很多种方法可以求得它的近似值。这里用比较容易实现的关于π的无穷级数来求它的前10000位的取值。 π / 2 π 具体的&#xff0c;用两个字符数组x,z分别存放当前计算得到的pi值&#xff0c;数组…

PAM(Pluggable Authentication Modules)如何配置

一、PAM解释 PAM&#xff08;Pluggable Authentication Modules&#xff09;是一个用于Linux和Unix系统上的用户认证的动态链接库。它提供了一种标准的认证接口&#xff0c;允许系统管理员通过配置文件来选择不同的认证模块&#xff0c;而无需修改应用程序代码。PAM支持多种认…