字符输入/输出和输入确认

缓冲区

缓冲分为两种:

  1. 完全缓冲:缓冲区满时被清空(内容发往目的地)
  2. 行缓冲:遇到一个换行字符时将被清空缓冲区

终止键盘输入

文件、流和键盘输入

低级I/O是使用宿主操作系统的基本工具来处理文件,由于系统的差异,所以无法建立一个通用的低级I/O标准库。因此C采用的是标准I/O包,级别更高,系统之间的差异由特定的C实现来处理,相当于提供了一个标准的接口

从概念上讲,C程序处理的是一个流而不是直接处理文件。

流(stream)是一个理想化的数据流,实际的输入或输出映射到这个数据流

C对待输入和输出设备与其对待存储设备上的普通文件相同,键盘的输入由一个被称为stdin的流表示,到屏幕上的输出由stdout流表示

文件结尾

检测文件结尾的两种方式:

  1. 在文件中放置一个特殊字符来标志结尾
  2. 让操作系统存储文件的大小信息

C语言统一处理方法:让getchar函数在到达文件末尾时返回一个特殊值EOF,而不管操作系统如何检测文件结尾的

重定向和文件

令程序和文件一同工作的方式:

  1. 明确使用打开文件、关闭文件、读文件、写文件等专用函数
  2. 使用一个设计用于与键盘和屏幕共同工作的程序,但使用不同通道重定向输入输出,即将stdin流重新分配至文件

输入重定向

<是Unix的重定向运算符,将文件和stdin流关联起来,把文件内容引导至程序,程序本身不关心输入是来自文件还是键盘

输出重定向

>将stdout从显示设备重定向于文件,如果文件已经存在,通常会删除文件然后用新文件代替之

组合重定向

注意:

  1. 重定向运算符的顺序无关紧要
  2. 不要对同一命令的输入输出使用相同的文件名
  3. 输入输出的文件只能是一个
  4. 只能用于一个可执行程序与另一个数据文件的连接
  5. 空格不是必须的

创建一个更友好的用户界面

混合输入数字和字符

getchar和scanf不能很好的混合,因为getchar读取每个字符,而scanf读取数字时则会跳过空格、制表符和换行符

输入确认

当scanf输入失败时,就会将错误的输入留在输入队列中,此时可以用getchar来逐个字符读取输入

一个经典的输入确认例子:

int get_int(void){
	int input;
	char ch;
	while(scanf("%d",&input)!=1){//如果输入不成功,则进入循环
		while((ch=getchar())!='\n'){//getchar逐个读取输入的字符
			putchar(ch);//剔除错误输入
		}
	}
  return input;
}
posted @ 2020-03-11 13:42  咸鱼不闲咋整啊  阅读(270)  评论(0编辑  收藏  举报