1. 流和文件对象
在标准IO库中,所有的操作都是针对文件流,流的定向决定了所读、写的字符是单字节还是多字节。流被创建时,并未被定向。下面这个函数可设置流的定向。
#include <wchar.h>
int fwide(FILE *stream, int mode);
mode参数决定了设置的定向:
- mode为正,字节定向。
- mode为负,宽定向。
- mode为0,不设置定向、但返回标识该流定向的值。
注意,fwide并不改变已经定向的流定向。
文件对象通常是一个结构,包含了IO库为管理该流的所有信息。包括如文件描述符、指向缓冲区的指针,长度;出错标志等等。
2. 缓冲
为了减少调用read、write次数,所以IO标准库提供了缓冲,分为三个类型:
- 全缓冲
在填满缓冲区后,才进行实际IO操作。 - 行缓冲
当输入输出遇到换行符时,才进行实际IO操作
注意:IO库用来收集每一行的缓冲区长度是固定的,所以只要填满了缓冲区,即使没有换行符,也进行IO操作。 - 不带缓冲
标准IO库对字符不进行缓冲。例如标准错误输出。
**flush:**或者称之为冲洗/刷新,其实就是标准IO缓冲区的写操作,即将缓冲区的内容写到磁盘上。缓冲区满时会自动刷新,或者调用fflush函数手动刷新。
如果想修改默认缓冲类型,可以用如下函数来修改:
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
mode参数可以精准的选择缓冲类型:
_IONBF unbuffered
_IOLBF line buffered
_IOFBF fully buffered
3. 对流的操作
3.1 打开流
下面的三个函数可以打开一个IO流:
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
三个函数的区别:
- fopen打开一个指定的文件
- fdopen获取一个现有的文件描述符,并使标准IO流与其相结合
- freopen是在一个指定流上打开一个文件
3.2 读/写流
三种非格式化IO,可对打开的流进行读写操作:
- 一次读或写字符,如果带缓冲,则处理整个缓冲
- 每次读写一行,使用fgets或者fputs。
- 直接IO。使用fread/fwrite。
3.3 定位流
有三种方法定位标准IO流:
- ftell和fseek函数
- ftello和fseeko函数
- fgetpos和fsetpos函数