赞
踩
I/O函数:输入/输出函数
I/O函数将信息传输至程序并从程序中传出信息,如printf()、scanf()、getchar()、putchar()等函数
getchar()和putchar()每次输入/输出一个字符
示例代码:
- #include <stdio.h>
- int main(void)
- {
- char c;
-
- // 输入回显,遇到'.'字符时终止
- while((c = getchar()) != '.')
- {
- putchar(c);
- }
- return 0;
- }
运行结果:
立即回显:非缓冲输入(直接输入)
延迟回显:缓冲输入,键入的字符被收集并存储在一个被称为缓冲区的临时存储区域中,按下回车可使所键入的字符快对程序变为可用
缓冲区的作用:
1)将若干个字符作为一个块传输比逐个发送这些字符耗费的时间更少
2)如果输入有误,缓冲区允许键盘更正功能以修正错误
一些交互性的程序需要非缓冲输入,缓冲和非缓冲输入具有各自的用途
缓冲分为两类:完全缓冲(fully buffered)I/O和行缓冲(line-buffered)I/O
完全缓冲输入:缓冲区满时被清空,内容被发送至其目的地;通常出现在文件输入中;缓冲区大小取决于系统,常见大小为512字节和4096字节
行缓冲输入:遇到一个换行字符时缓冲区被清空,内容被发送至其目的地;键盘输入是标准的行缓冲,按下回车键将清空缓冲区
ANSI C指定应该对输入进行缓冲;K&R则将选择权留给编译器的编写者
不存在调用非缓冲输入的标准ANSI方式;使用的方法取决于计算机系统
(上面的示例代码的运行结果体现的是缓冲输入,即输入的字符串在按下回车键之后才显示在屏幕上)
上面的示例代码中,通过字符'.'结束键盘输入,但是现实中字符'.'可能在正常输入中出现,这种通过特定字符结束键盘输入的方法在一些场合下会遇到不便
因此,一般希望终止字符不在文本中出现,不会在希望程序结束前打断程序
1. 文件、流和键盘输入
文件(file):一块存储信息的存储器区域
C处理文件的2种级别:
级别一(低级I/O):使用宿主操作系统的基本文件工具处理文件
级别二(标准I/O包):创建用于处理文件的I/O函数的标准模型和标准集;系统之间的差异由特定的C实现来处理,上层应用通过统一接口实现文件处理
概念上,C程序处理一个流而不是直接处理文件
流(stream)是一个理想化的数据流,实际输入或输出映射到这个数据流
具有不同属性的多种类型的输入由流表示,具有更多统一的属性
打开文件的过程成为将流与文件关联,并通过流进行读写的过程
C对待输入和输出设备与其对对待存储设备上的普通文件相同
键盘和显示设备作为每个C程序自动打开的文件来对待
键盘输入由一个被称为stdin的流表示;屏幕(或其他输出设备)上的输出由一个被称为stdout的流表示
getchar()、putchar()、printf()、scanf()函数都是标准I/O包的成员,同stdin和stdout两个流打交道
结论:可以使用与处理文件相同的技术来处理键盘输入;例如,读取文件的程序需要一种方法检测文件的结尾,以了解停止读取的位置
C输入函数装备有一个内置的文件尾检测器,对于键盘输入也可以使用文件尾检测器终止键盘输入
2. 文件结尾
计算机操作系统判断文件结尾的方法:
1)在文件中放置一个特殊字符来标志结尾(例如内嵌的Ctrl+Z字符)
2)让操作系统存储文件大小的信息
C的处理方法:让getchar()函数在到达文件结尾时返回一个特殊值,而不去管操作系统是如何检测文件结尾的;赋予该值的名称是EOF(end of file,文件尾)
检测到文件尾时getchar()和scanf()的返回值是EOF
通常EOF在stdio.h中定义:
#define EOF (-1)
将EOF定义为-1:在绝大多数情况下,值-1都不对应任何字符,所以可以用其表示文件结尾
一些系统也许会将EOF定义为-1以外的值,但该定义总是与合法的输入所产生的返回值不同
实际使用时,只要包含了stdio.h文件并使用了EOF符号,就不必考虑EOF的数值定义,EOF代表的值表示检测到文件结尾,其值并不是实际出现在文件中的一个符号
示例代码:改写一开始的程序
- #include <stdio.h>
- int main(void)
- {
- int c;
-
- // 输入回显,遇到EOF时终止
- while((c = getchar()) != EOF)
- {
- putchar(c);
- }
- return 0;
- }
1)stdio.h中对EOF进行定义
2)使用时不必在意EOF的值,不需要给EOF重新赋值,直接用符号表示
3)因为EOF可能用-1表示,所以变量c的类型改为int
4)键盘输入时,键入EOF的方式根据系统而异
在大多数Unix系统上,在一行的开始键入Ctrl+D会导致传送文件结尾信号
许多微机系统将一行的开始位置键入的Ctrl+Z识别为文件尾信号;还有一些微机系统把任意位置的Ctrl+Z解释为文件尾信号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。