字符输入/输出和输入确认
缓冲区
缓冲分为两种:
- 完全缓冲:缓冲区满时被清空(内容发往目的地)
- 行缓冲:遇到一个换行字符时将被清空缓冲区
终止键盘输入
文件、流和键盘输入
低级I/O是使用宿主操作系统的基本工具来处理文件,由于系统的差异,所以无法建立一个通用的低级I/O标准库。因此C采用的是标准I/O包,级别更高,系统之间的差异由特定的C实现来处理,相当于提供了一个标准的接口
从概念上讲,C程序处理的是一个流而不是直接处理文件。
流(stream)是一个理想化的数据流,实际的输入或输出映射到这个数据流
C对待输入和输出设备与其对待存储设备上的普通文件相同,键盘的输入由一个被称为stdin的流表示,到屏幕上的输出由stdout流表示
文件结尾
检测文件结尾的两种方式:
- 在文件中放置一个特殊字符来标志结尾
- 让操作系统存储文件的大小信息
C语言统一处理方法:让getchar函数在到达文件末尾时返回一个特殊值EOF,而不管操作系统如何检测文件结尾的
重定向和文件
令程序和文件一同工作的方式:
- 明确使用打开文件、关闭文件、读文件、写文件等专用函数
- 使用一个设计用于与键盘和屏幕共同工作的程序,但使用不同通道重定向输入输出,即将stdin流重新分配至文件
输入重定向
<
是Unix的重定向运算符,将文件和stdin流关联起来,把文件内容引导至程序,程序本身不关心输入是来自文件还是键盘
输出重定向
>
将stdout从显示设备重定向于文件,如果文件已经存在,通常会删除文件然后用新文件代替之
组合重定向
注意:
- 重定向运算符的顺序无关紧要
- 不要对同一命令的输入输出使用相同的文件名
- 输入输出的文件只能是一个
- 只能用于一个可执行程序与另一个数据文件的连接
- 空格不是必须的
创建一个更友好的用户界面
混合输入数字和字符
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;
}