前面介绍的《文件I/O》都是针对文件描述符进行操作的,并且是非缓冲区方式的。本节记录的标准I/O的操作是在流进行的,当用标准I/O打开或创建一个文件时,已使一个流与一个文件相关联。
标准I/O文件的流可用与单字节或多字节(宽)字符集。流的定向决定所读、写的字符是单字节还是多字节。流最初被创建时,并没有定向,若在未定向的流上使用一个多字节I/O函数,则将该流的定向设置为宽定向,若是使用一个单字节I/O函数,则将该流的定向设置为字节定向。只有两个函数可以改变流的定向:freopen函数清除一个流的定向;fwide函数设置流的定向。
/***********
* 设置流的定向
* 返回值:
* 1、若流是宽定向则返回正值;
* 2、若流是字节定向则返回负值;
* 3、若流是未定向则返回0;
* 函数原型:
* #include <stdio.h>
* #include <wchar.h>
* int fwide(FILE *fp, int mode);
* 说明:根据mode的不同值,fwide操作不同:
* 1、mode为负值,fwide试图使指定的流是字节定向;
* 2、mode为正值,fwide试图使指定的流是宽定向;
* 3、mode值为0,fwide不设置流的定向,返回标识该流定向的值;
* 注意:fwide并不改变已定向流的定向
* *************/
标准输入、输出和出错
/************
* 标准输入 stdin
* 标准输出 stdout
* 标准出错 stderr
* ***********/
缓冲区
/**************
* 缓冲:目的是减少数据的读写次数;
* 标准I/O的缓冲类型:
* 1、全缓冲:填满标准I/O缓冲区之后才进行实际I/O操作;
* 2、行缓冲:挡在输入和输出中遇到换行符,则执行I/O操作;
* 3、不带缓冲:标准I/O库不对字符进行缓冲存储;
*
* 函数功能:更改缓冲区类型
* 返回值:若成功则返回0,若出错则返回非0;
* 函数原型:
* #include <stdio.h>
* void setbuf(FILE *fp, char *buf);
* int setvbuf(FILE *fp,char *buf, int mode, ssize_t size);
* 注意:使用这两个函数必须确定fp流已经打开。
*
* setbuf函数打开或关闭缓冲机制,参数buf指定一个长度为BUFSIZE的缓冲区。
* sevbuf函数根据参数mode指定缓冲类型:
* mode参数:
* _IOFBF 全缓冲
* _IOLBF 行缓冲
* _IONBF 不带缓冲
*____________________________________________________________
|函数 | mode | buf | 缓冲区及长度 | 缓冲类型 |
|_______|________|________|____________________|_____________|
|setbuf | | 非空 | 长度BUFSIZE的buf | 全或行缓冲 |
| | | NULL | 无缓冲区 | 不带缓冲区 |
|_______|________|________|____________________|_____________|
|setvbuf| _IOFBF | 非空 | 长度size的buf | 全缓冲 |
| | | NULL | 合适长度缓冲区 | |
| | _IOLBF | 非空 | 长度size的buf | 行缓冲 |
| | | NULL | 合适长度的缓冲区 | |
| | _IONBF | 忽略 | 无缓冲区 | 不带缓冲区 |
|_______|________|________|____________________|_____________|
********/
参考资料
《unix高级环境编程》