目录
第八章 字符输入输出和输入验证
单字符I/O
使用的是
getchar()
和putchar()
函数,它们都定义在stdio.h
头文件中
设计一个程序从键盘获取输入字符并输出,直到遇到#
字符停止:
#include<stdio.h>
#define STOP '#'
int main(void)
{
char ch;
while ((ch = getchar()) != STOP)
{
putchar(ch);
}
return 0;
}
交互式输入输出:
这是第一行输入
这是第一行输入
下面输入空格行
下面输入空格行
最后一行正常输入
最后一行正常输入
带井号的输入
带井号的输入
这是一行带#号的输入
这是一行带%
缓冲区
1.无缓冲输入
在老式系统中运行上述代码,可能会出现如下情况:
HHeelllloo,, tthheerree .. II ww[enter]
lliikkee aa #
像这种直接重复打印用户输入结果的属于“无缓冲”输入,即程序可立即使用输入的字符(有一个问题就是你甚至无法直接修改你的输入)。
2.缓冲输入
大部分系统在用户按下Enter
键之前不会重复打印正在输入的字符,这种输入形式属于缓冲输入。用户输入的字符被收集并存储在一个被称为缓冲区(buffer)的临时存储区,按下Enter
键后程序才可以使用用户输入的字符。
3.使用缓冲区的原因
- 把若干字符作为一个块进行传输比逐个发送字符节约时间
- 如果用户打错字符,可以通过键盘修正错误
- 即使缓冲输入有诸多好处,但是无缓冲输入也有应用,比如在游戏等交互式程序中,我们希望按下一个键就执行对应的指令
4.缓冲的类别
- 完全缓冲I/O:指缓冲区被填满才刷新缓冲区(内容被发送至目的地),==通常出现在文件输入中==。缓冲区的大小取决于系统,常见的是512字节和4096字节
- 行缓冲I/O:出现换行符时刷新缓冲区,键盘输入通常是行缓冲输入,按下
Enter
键后才刷新缓冲区
结束键盘输入
1.文件,流和键盘输入
- 文件:存储器中存储信息的区域,通常文件都保存在某种永久存储器中。对于文字处理器,不仅要打开、读取和关闭文件,还需要把数据写入文件
- 流:C处理的是流而并非文件,流是一种实际输入或输出映射的理想化数据流。打开文件的过程就是把流和文件相关联,并且读写都通过流来完成
2.文件结尾
无论操作系统以何种方法检测文件结尾,在C语言中,getchar()
和scanf()
方法读取文件检测到文件结尾时将返回一个特殊的值EOF(end of file)
。
通常
EOF
定义在stdio.h
头文件中,常常被定义为-1
,因为getchar()
的返回值通常介于0~255
,-1
不对应于任何字符。
在下面这个程序中,每次按下Enter
键系统就会处理缓冲区中存储的字符,并在下一行打印输入行的副本,直到遇到EOF
:
#include<stdio.h>
int main(void)
{
char ch;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}