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

举报
周棋洛 发表于 2022/05/25 23:18:52 2022/05/25
【摘要】 文章目录 单字符 I/O :getchar()和putchar()缓冲区结束键盘输入小结: 最初,输入输出函数还不是C语言定义的一部分,后来UNIX系统中的C实现为这些函数提供...


最初,输入输出函数还不是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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述


缓冲区

上面的程序为什么这样输出呢,这就要说到缓冲区。
缓冲分为无缓冲缓冲区两类
无缓冲:回显用户输入的字符后立即重复打印该字符
缓冲区:对于大部分系统在用户按下enter键之前不会重复打印刚输入的字符(一个临时存储区)

为什么要有缓冲区?

  1. 把若干字符作为一个块进行传输比逐个发送这些字符节约时间。
  2. 如果打错字,可以通过键盘直接修改,最后按下enter键,正确输入。

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

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

缓冲分为两类

  1. 完全缓冲输入输出:指的是当缓冲区被填满时才刷新缓冲区(内容发送到目的地)
  2. 行缓冲输入输出:指的是在出现换行符时刷新缓冲区,键盘输入通常是行缓冲输入,所以在按下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

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

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

小结:

通过对输入输出的理解,以及缓冲区是什么,为什么要有缓冲区,无缓冲有什么用等心里的疑问统统搞清楚,这样理解计算机设计理解一些接近底层的知识,多我们理解程序,理解规定,查找问题有很大的帮助。最后学习了结束键盘输入的方法,我们应认真设计用户界面,事先料到程序可能会出现的问题,然后这对这些情况妥善的处理,使得程序有更好的用户体验。🆗


在这里插入图片描述
陨石坠落的速度是每秒十千米,我该用怎么样的速度,才能将你拯救。


文章来源: blog.csdn.net,作者:周棋洛ყ ᥱ ᥉,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_53321320/article/details/118568774

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。