理解缓冲区,字符 I/O和结束键盘输入

简介: 理解缓冲区,字符 I/O和结束键盘输入

文章目录


单字符 I/O :getchar()和putchar()


缓冲区


结束键盘输入


小结:


最初,输入输出函数还不是C语言定义的一部分,后来UNIX系统中的C实现为这些函数提供了一个模型。ANSI C 库吸取其成功的经验,咳咳,我们来学习所有系统通用的标准 I/O 函数


单字符 I/O :getchar()和putchar()


其实他俩都不是真正的函数,它们被定义为供预处理器使用的宏(后面深入探讨)


#include <stdio.h>
int main(void){
    char a;
    while ((a=getchar())!='&')
        putchar(a);
    return 0;
}

20210708105808834.png


缓冲区



上面的程序为什么这样输出呢,这就要说到缓冲区。

缓冲分为无缓冲和缓冲区两类


无缓冲:回显用户输入的字符后立即重复打印该字符

缓冲区:对于大部分系统在用户按下enter键之前不会重复打印刚输入的字符(一个临时存储区)


为什么要有缓冲区?


把若干字符作为一个块进行传输比逐个发送这些字符节约时间。


如果打错字,可以通过键盘直接修改,最后按下enter键,正确输入。


缓冲输入和无缓冲都是必要的


某些交互式程序需要无缓冲输入。比如,游戏中,你希望按一下键就执行相应的指令,响应速度快。


缓冲分为两类


完全缓冲输入输出:指的是当缓冲区被填满时才刷新缓冲区(内容发送到目的地)


行缓冲输入输出:指的是在出现换行符时刷新缓冲区,键盘输入通常是行缓冲输入,所以在按下enter后才刷新缓冲区


ANSI C和后续的C标准都规定输入是缓冲的


一些计算机不允许无缓冲输入,你说你的计算机允许无缓冲输入,🆗,C很贴心,你可以通过 conio.h 头文件引入一系列特殊的函数


这些函数包括回显无缓冲输入的grtche()函数和无回显无缓冲输入的getch()函数

回显输入意味着用户输入的字符直接显示在屏幕上,无回显输入意味着击键后对应的字符不显示


结束键盘输入


像之前的程序,我用&来结束程序,可是&符号避免不了要用到,那么C也提供了这样的字符


文件,流和键盘输入


文件(file)是存储器中存储信息的区域。通常,文件都保存在某种永久存储器中(硬盘,U盘,数字多功能光盘等),由此可见它的重要性


C是一门强大,灵活的语言,有许多用于打开,读取,写入和关闭文件的库函数


概念上,C程序处理的是流而不是直接处理文件,流是一种实际输入和输出映射的理想数据化流。这就意味着不同属性和不同种类的输入,由属性更统一的流来表示,于是,打开文件的过程就是把流与文件相关联·,而且读写都通过流来完成,stdin流表示键盘输入,stdout流表示屏幕输出。


文件结尾


计算机操作系统要以某种方式判断文件的开始和结束。

检测文件结尾的一种方法是,在文件的末尾放一个特殊字符标记文件的结束。这些系统可以使用内嵌的ctrl+z字符来标记文件结尾,这曾是操作系统使用的唯一标记。


操作系统使用的另一个防方法是储存文件大小的信息。新版的DOS也使用这种方法处理文本文件,UNIX使用这种方法处理所有文件。


在C中,EOF(end of file)是检测到文件结尾后返回的值,它定义在stdio.h的头文件中。


#define EOF (-1)


看到头文件里为啥子定义为-1呢?


因为getchar()函数返回值通常在0~127之间,也有可能更大扩展字符集,但无论怎样,-1都不对应任何的字符,该值可用于标记文件的结尾


小结:



通过对输入输出的理解,以及缓冲区是什么,为什么要有缓冲区,无缓冲有什么用等心里的疑问统统搞清楚,这样理解计算机设计理解一些接近底层的知识,多我们理解程序,理解规定,查找问题有很大的帮助。


最后学习了结束键盘输入的方法,我们应认真设计用户界面,事先料到程序可能会出现的问题,然后这对这些情况妥善的处理,使得程序有更好的用户体验。🆗



相关文章
|
运维 监控 Devops
DevOps实践:从理论到落地的旅程
在软件开发和运维日益融合的今天,DevOps已不仅仅是一个流行词汇。它代表了一种文化和实践的转变,旨在打破部门间的壁垒,加速产品从构思到市场的流程。本文将带你了解DevOps的核心理念,并通过实际案例展示如何将这些理念应用到日常工作中,实现高效协作和持续改进。无论你是DevOps新手还是资深专家,这篇文章都将为你提供新的视角和实用的技巧。
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
本文详细介绍了如何使用Python爬取简单的网页数据,以掘金为例,展示了从发送HTTP请求、解析HTML文档到提取和保存数据的完整过程。通过这个示例,你可以掌握基本的网页爬取技巧,为后续的数据分析打下基础。希望本文对你有所帮助。
|
关系型数据库 MySQL 数据库
Python 基于 Django 的公务员考试信息管理系统+数据库(附源码,教程)
Python 基于 Django 的公务员考试信息管理系统+数据库(附源码,教程)
|
Java 关系型数据库 MySQL
基于Java的KTV点歌系统
基于Java的KTV点歌系统
|
资源调度 Kubernetes 应用服务中间件
Deployment的创建、滚动更新、回滚版本、扩容缩容
Deployment的创建、滚动更新、回滚版本、扩容缩容
486 1
|
JavaScript Java 测试技术
基于springboot+vue.js的环保网站附带文章和源代码设计说明文档ppt
基于springboot+vue.js的环保网站附带文章和源代码设计说明文档ppt
170 4
|
存储 缓存 NoSQL
缓存:热点key重建优化。
缓存:热点key重建优化。
188 0
|
负载均衡 监控 网络协议
TCP四次挥手:为什么四次?原理大揭密!
**TCP四次挥手详解**:客户端发送FIN进入FIN-WAIT-1,服务器回ACK进CLOSE-WAIT;服务器发送FIN,客户端回ACK进TIME-WAIT,等待2MSL确保数据传输完毕,防止新旧连接混淆。四次挥手确保双方完全关闭连接,解决数据丢失问题。过多TIME-WAIT可通过负载均衡、优化关闭顺序或调整系统参数缓解。关注“软件求生”获取更多技术内容!
269 0
Mac下安装zookeeper
Mac下安装zookeeper
319 0
|
设计模式 消息中间件 存储
揭秘中介者模式-如何优雅地管理对象间的沟通
本文深入探讨了中介者模式在软件设计中的应用。中介者模式,作为一种行为型设计模式,通过引入中介者对象有效管理对象间的复杂交互,降低了系统的耦合度。文章详细分析了该模式的优点,如提高系统的灵活性和可维护性,同时也指出了其面临的挑战和局限,如中介者可能变得庞大难以维护、动态性处理复杂等。在使用中介者模式时,需要权衡利弊,合理设计中介者类,并持续维护系统的可扩展性和可维护性。总之,中介者模式为软件设计提供了一种有效的解耦和协调交互的机制,但需要根据具体场景和需求谨慎选择和应用。通过合理使用中介者模式,可构建更...
467 0
揭秘中介者模式-如何优雅地管理对象间的沟通