Chapter8 Character Input/Output and Input Validation
8.1 Single-characterI/O: getchar(); putchar()
getchar()
- 返回值为输入字符的ASCII码,是int类型。
- 程序在调用这个函数时,会等待用户输入并将用户的输入存进缓冲区。当用户按下空格时,getchar()开始读取缓冲区的字符
- 会读取换行符等。
putchar()
8.2 缓冲区(buffer)
- 为什么要有缓冲区:把若干字符一起发送更节约时间
- 完全缓冲i/o和行缓冲i/o:
-
- 完全缓冲是指缓冲区被填满之后才会刷新缓冲区,常见于文件输入。缓冲区的大小由系统决定 常见的是512字节和4096字节。
-
- 行缓冲是指在出现换行符时刷新缓冲区
8.3 结束键盘输入
8.3.1 文件,流和键盘输入
- 文件:存储器中存储信息的区域。
- 底层I/O: 直接调用主机操作系统的基本文件工具直接处理文件。
- 较高层面 c通过标准io来处理文件,可以处理不同系统间的差异。
- 上述讨论的差异是指:
-
- 不同的系统存储文件的方式不同。
-
- 不同系统标识结尾的方式不同。
-
- 有些系统文件数据本身和文件相关信息存储在一处,有些系统存储在不同的区域。
- 如果使用标准io,不需要考虑这些因素。
- 流(stream):是一个实际输入或者输出的映射的理想化数据流,,不同属性和不同种类的输入,由属性更加统一的流来表示。(详见13章)
8.3.2 文件结尾
在一些操作系统中使用
- 使用特殊字符:例如\h+z
- 通过记录文件长度。
在c语言中
- getcahr()在读到文件末尾会返回一个特殊的值EOF EOF在stdio.h文件中的定义为 #define EOF (-1)
-
- 因为getchar()返回的指一般在0-127之间,所以-1不对应任何字符。
#include<stdio>
int main(void){
int ch;
while((ch=getchar())!=EOF){
putchar(ch);
}
return 0;
}
-
- ch是整型不会影响putchar输出。
-
- 在使用该程序输入时,要设法输入EOF 不能输入-1 ,因为会被识别为两个符号,在大多数UNIX和Linux系统中,Ctrl+D会传送文件结束符号。
8.4 重定向文件
8.4.1 UNIX Linux DOS 重定向
1.重定向输入输出
- 文件重定向输入输出就是将文件的内容给标准输入流,即让程序的输入不是键盘,而是文件。重定向输出让程序不是输出到屏幕上而是文件中。
- 例: 假设 echo_eo。exe 是已经编译的文件。
echo_eof < words
因为c把文件和I/O放在一个层面,所以并不关心输入的来源。 - 例:重定向输出
echo_eof > mywords
2.组合重定向
- 重定向符号规则:
- 重定向运算符连接一个可执行文件和一个数据文件
- 使用重定向运算符不能从多个文件获取输入或输出到多个文件。
- 输入和输出文件名不能相同,
- addition: UNIX Linux 和Windows/DOS还有>> 运算符,把数据添加到现有文件的末尾。而|运算符能把一个文件的输出连接到另一个文件的输入。
3.注释
- VS 将编译后的可执行文件放在项目文件夹的子文件夹 称为Debug
8.5 创建更友好的用户界面(一定要注意最后的换行符!!!)
8.5.1 使用缓冲输入
- 缓冲输入要求用书按下enter发送输入,这一动作也传送了换行符。程序员需要合理处理这个换行符。
- 例子
#include<stdio>
int main(void){
int guess = 1;
printf("Pick an integer from 1 to 100,I'll try to guess")
printf("it.\nResponse with a y if my guess is right or with")
printf("\nAn n if it is wrong")
printf("ummm is your number is %d",guess)
while(getchar()!="y"){
printf("well, is it %d",++guess)
}
return 0
}
这段代码是有问题的,用户输入y后会跟一个enter,在while语句的判断过程中,会认为用户否认了一个答案。
修改
while(getchar()!="y"){
while(getchar()!="\n"):
continue;
}
8.6 输入验证
即处理用户的非法输入,具体情况具体分析。
本章没有特别复杂的知识点,主要理解缓冲区,和重定向。