C 语言中字符的输入输出
一、缓冲区
无缓冲输入:对于用户输入的字符在进行回显之后立即重复打印字符,换句话说,正在等待的程序可立即使用输入的字符。
缓冲输入:大部分系统是输入时,在键入Enter键之间不会重复打印刚输入的字符,此时用户输入的字符被储存在一个被称为缓冲区(buffer)的临时存储区,只有键入Enter键之后,程序才可使用用户输入的字符。
缓冲区的必要性:1 - 把若干个字符作为一个块进行传输比逐个发送这些字符节约时间;2 - 如果用户输入了错误的字符,可以直接通过键盘进行错误的修正,当最后键入Enter键之后,才向程序传输输入值。
【无缓冲输入、缓冲输入各有优势,根据具体的应用场景进行运用。】
缓冲区的分类:完全缓冲 I/O 和 行缓冲 I/O。【完全缓冲 I/O:当缓冲区被填满时才刷新缓冲区(也就是将内容传递到目的地),常见的应用场景是文件输入,缓冲区的大小主要取决于系统,常见的大小是 512 Byte 和 4096 Byte;行缓冲 I/O:在出现换行符时刷新缓冲区,键盘输入通常是行缓冲,只有在键入Enter键之后才会刷新缓冲区。】
二、文件、流和键盘输入
文件(file)是存储器中储存信息的区域。通常文件都是保存在某种永久存储器中(U盘、硬盘等)。C 语言中包含许多打开、读取、写入和关闭文件的库函数。从较底层面上来讲,C可以使用主机OS的基本文件工具直接对文件进行处理,这些直接调用OS的函数被称为底层 I/O (low-level I/O)。由于计算机系统各不相同,不可能为普通的底层 I/O 创建标准库。从较高层面上来讲,C 还可以通过标准 I/O 包(standard I/O package)来处理文件,这些涉及到创建用于处理文件的标准模型和一套标准 I/O 函数。从概念上看,C 程序处理的是流而不是直接处理文件。
流(stream)是一个实际输入或输出映射的理想化数据流,以为着不同属性和不同种类的输入,由属性统一的流来表示。对于C 程序来说,打开文件的过程就是把流与文件相关联,读写操作都是通过流来完成。
stdin 流:键盘输入;stdout 流:屏幕输出。
getchar()、puthar()、printf()、scanf()函数都是标准 I/O 包的成员。
三、重定向输入 / 输出
funtion < file
funtion:系统编译生成的可执行文件,其功能是获取用户从键盘输入的输入信息。
file:文本文件名。
‘ < ’:UNIX 和 Windows 的重定向运算符。
上述命令的功能:把 file 中的内容导入 function 程序中。function 程序本身并不知道(或不关心)输入的内容是来自文件还是键盘,只知道这是需要导入的字符流,读取内容并把字符逐个打印到屏幕上,知道读取到文件结尾(EOF)。【C 把文件和 I/O 设备放在一个层面。】
funtion > myfile
funtion:系统编译生成的可执行文件,其功能是获取用户从键盘输入的输入信息。
myfile:文本文件名。
‘ > ’:UNIX 和 Windows 的重定向运算符。
上述命令的功能:创建一个名为 myfile 的文件,之后把 function 的输出(键盘输入的副本)重定向至 myfile 文件中。如果 myfile 文件之前就已存在,通常会擦除该文件的内容,然后替换成新的内容。对于 function 程序来说,在下一行的开始出按下 Ctrl + D (UNIX) 或 Ctrl + Z (DOS) 即可结束程序。
funtion < file > myfile
组合重定向,制作一份 file 的副本。命令与重定向运算符的顺序无关,也就是说,file 和 myfile 及其运算符的相对位置可变。
【重定向运算符链接一个可执行程序(包括标准OS命令)和一个数据文件,不能用于连接一个数据文件和另外一个数据文件,也不能用于连接一个程序与另外一个程序。】
【使用重定向运算符不能一次性读取多个文件的输入,也不能一次性输出定向至多个文件。】