ANSI C-buffered I/O(标准I/O)
一.标准I/O是什么?
标准I/O指的是ANSI C中定义的用于I/O操作的一系列函数。
二.为何要用标准I/O?
1.可移植性好。操作系统中只要安装了C库,源代码不需要修改就可以在操作系统下编译运行。
2.减少了系统调用,提高了系统效率。标准I/O带缓冲机制,使用时在用户空间创建缓冲区,读写时先操作缓冲区,在合适时机通过系统调用访实际文件。
三、什么是流(stream)?
流是程序输入或输出的一个连续的字节序列,设备(例如鼠标、键盘、磁盘、屏幕、调制解调器和打印机)的输入和输出都是用流来处理的。
在C语言中,所有的流均以文件的形式出现----不一定是物理磁盘文件,还可以是对应于某个输入/输出源的逻辑文件。
此外,stdin并不一定来自键盘,stdout也并不一定显示在屏幕上,它们都可以重定向到磁盘文件或其它设备上。
标准I/O打开一个文件时,就会创建一个FILE*结构体描述该文件,类似文件I/O中的文件描述符,这个FILE*结构体形象的被称为流。
四、标准I/O中流的3种缓冲类型
1.全缓冲
当填满标准I/O缓冲区后才执行实际I/O操作。
对于标准I/O打开的磁盘的普通文件默认是全缓冲。当缓冲区已满或执行fflush()才会进行磁盘操作。
标准输入和标准输出默认是全缓冲,但是如果和终端相关就是行缓冲。
2.行缓冲
当在输入和输出中遇到换行符时,标准I/O库函数将会执行系统调用操作。
当所操作的流涉及一个终端时(例如标准输入和标准输出),使用行缓冲方式。
因为标准I/O库每行的缓冲区长度是固定的,所以只要填满了缓冲区,即使还没有遇到换行符,也会执行I/O系统调用操作,默认行缓冲区的大小为1024。
3.无缓冲
对流的读写立刻操作实际文件。标准出错不带缓冲。
标准输入和标准输出设备:当且仅当不涉及交互作用设备时,标准输入流和标准输出流才是全缓冲的。