printf() scanf() putchar() getchar()都是C中的标准的I/O函数,因为这样的标准的函数必须在很多种类的计算机环境中工作,所以这些函数很少利用某个特定系统的特殊性能。
单字符I/O:putchar() getchar()(其中putchar()是输出,getchar()是输入)
一次只能输入或者输出一个字符,但是能够容易的读取多与单个字符的一组数据(使用循环),是大多数处理文本的程序核心。
缓冲区:
输入字符的立即回显是非缓冲(unbuffered)或直接(direct)输入的一个实例,键入的字符立即变为可用
延迟回显是缓冲(buffered)输入的实例,所键入的字符被存储在被称为缓冲区的临时存储区域,按回车键可使键入的区域变为可用
缓冲的优势:
首先是将若干个字符一起发送比单独发一个字符要节约时间,其次当输入有误的时候,可以使用键盘进行更正,这样按回车后就能输入正确的内容了
非缓冲的优势:
对于一些交互性的程序需要非缓冲的输入,例如,在游戏中,希望按一下键就可以执行某一条命令,因此缓冲和非缓冲具有它们各自的用途
缓冲分为两类:
1.完全缓冲(fully buffered)I/O,缓冲区满时被清空(内容被发到目的地),通常出现在文件输入中,缓冲区的大小取决于系统,一般为512Bytes 或者 4096Bytes
2.行缓冲(line-buffered)I/O,遇到一个换行字符就被清空缓冲区,键盘输入是标准的行缓冲,按下回车键将清空缓冲区。
C程序处理一个流而不是直接处理文件,流(stream)是一个理想化的数据流,实际数入或者输出映射到这个数据流,这意味着具有不同属性的多种类型的输入由流表示,会具有更多统一的属性。于是打开文件的过程就成为将流与文件相关联,并通过流进行读写的过程。
键盘的输入由stdin流表示,到屏幕的输出由stdout流表示,getchar() putchar() printf() sanf()函数都是标准的I/O包的成员,这些函数通这两个流打交道。
判断文件输入结束:
1.利用特殊的结束字符来判断文件输入结束,比如ctrl+Z,但是这种情况下文件中就不能再嵌入这样的字符了
2.让操作系统存取文件的大小的信息,当程序读取了相应的大小的数据的时候就停止读入,这种情况下文件可以内嵌所有的字符
3.C语言中的文件结束符EOF,当getchar()检测到字符的值等于EOF(-1)的时候,就停止接收字符
重定向和文件:
默认的情况下标准I/O包的C程序标准输入作为其输入源,标准输入就是stdin,但是我们希望您能告诉一个程序从文件而不是键盘寻求其输入
令程序和数据一起工作有两种方式:
1.明确的使用打开文件、关闭文件、读文件、写文件等专门的函数
2.使用一个设计用于与键盘和屏幕共同工作的程序,但是使用不同通道重定向(redirect)输入和输出,这一种方法比第一种方法在一些方面功能更有限,但它更容易使用,而且是您能够更加熟悉常用的文件处理技术
重定向技术的一个主要的问题是其与操作系统而不是C相关联
UNIX、Linux和DOS的重定向:
1.输入重定向:运行一个程序,如果直接运行则要用键盘进行输入,但是当有输入文本文件的时候(文本文件中是人可读的信息),可以运行以下的命令
<文件名> < <文本文件名>
其中 < 符号是UNIX、Linux(和DOS)的重定向运算符
2.输出重定向:<程序名> > <输出文件名>,其中>是另一个重定向符,将程序的输出保存在输出文件名中,如果系统中已经包含于输出文件名相同的文件,则将文件删除,重新生成,但时若将文件权限改为只读,那么就不会将文件删除
3.组合重定向: <程序名> < <输入文件名> > <输出文件名> 但时注意不要使输入输出使用相同的文件名
重定向运算符的遵循规则:
1.重定向运算符将一个可执行的程序(包括标准的操作系统命令)与一个数据文件链接起来,该运算符不能用于两个数据文件的连接,也不能用于两个程序的连接
2.使用这些运算符时,输入不能来自一个以上的文件,输出也不能定向到一个以上的文件
3.除了偶尔在使用到一些对Unix shell、Linux shell 或DOS具有特殊意义的字符时,名字和操作符之间的空格并不是必须的
输入确认:
scanf()返回其成功输入的项目的个数