内存流(UNIX环境高级编程笔记)
在SUSv4中支持了内存流。这就是标准I/O流,虽然仍使用FILE指针进行访问,但是其实并没有底层文件。所有的I/O流都是通过在缓冲区和主存之间来回传送字节来完成的。
有3个函数可用于内存流的创建,第一个是fmemopen函数。
#include <stdio.h> FILE *fmemopen(void * restrict buf, size_t size, char *restrict type); 返回值:若成功,返回流指针;若错误,返回NULL。 |
---|
fmemopen函数允许调用者提供缓冲区用于内存流:buf参数指向缓冲区开始的位置,size参数指定了缓冲区大小的字节数。如果buf参数为NULL,fmemopen函数分配size字节数的缓冲区。在这种情况下,流关闭时缓冲区被释放。
type参数控制如何使用流。type可能的取值如图所示:
type的取值与基于文件的标准I/O有一些微小差别。
(1):无论何时以追加方式打开内存流时,当前文件位置设为缓冲区的第一个null字节。如果缓冲区没有null字节,则当前文件位置就设置为缓冲区结尾的最后一个字节。
(2)如果buf参数是一个null指针,打开流进行读或者写都没有任何意义。因为在这种情况下缓冲区是通过fmemopen进行分配的,没有办法找到缓冲区的地址,只写方式打开流意味着无法读取自己写入的数据,同样,以只读方式打开流意味着只能读取那些我们无法写入缓冲区中的数据。
(3)任何时候需要增加流缓冲区中数据量以及调用fclose、fflush、fseek、fseeko以及fsetpos时都会在当前位置写入一个null字节。
用于创建内存流的其他两个函数分别是open_memstream和open_wmemstream。
#include <stdio.h> FILE *open_memstream(char **bufp, size_t *sizep); #include <wchar.h> FILE *open_wmemstream(wchar_t **bufp, size_t *sizep); |
---|
因为避免了缓冲区溢出,内存流非常适用于创建字符串。因为内存流只访问主存,不访问磁盘上的文件,所以对于把标准I/O流作为参数用于临时文件的函数来说,会有很大的性能提升。