内存流
#include <stdio.h>
FILE *fmemopen(void *restrict buf,size_t size,const char *restrict type);
type参数控制如何使用流。
type | 说明 |
---|---|
r或rb | 为读而打开 |
w或wb | 为写而打开 |
a或ab | 追加:为在第一个null字节处写而打开 |
r+或r+b或rb+ | 为读和写而打开 |
w+或w+b或wb+ | 把文件截断至0长,为读和写而打开 |
a+或a+b或ab+ | 追加:为在第一个null字节处读和写打开 |
#include "apue.h"
#define BSZ 48
int main()
{
FILE *fp;
char buf[BSZ];
memset(buf,'a',BSZ-2);
buf[BSZ-2]='\0';
buf[BSZ-1]='X';
if((fp=fmemopen(buf,BSZ,"w+"))==NULL)
err_sys("fmemopen Failed");
printf("initial buffer contents: %s\n",buf);
fprintf(fp,"hello,world");
printf("before flush: %s\n",buf);
fflush(fp);
printf("after fflush: %s\n",buf);
printf("len of string in buf = %ld\n",(long)strlen(buf));
memset(buf,'b',BSZ-2);
buf[BSZ-2]='\0';
buf[BSZ-1]='X';
fprintf(fp,world");
fseek(fp,0,SEEK_SET);
printf("after fseek: %s\n",buf);
printf("len of string int buf = %ld\n",'c',world");
fclose(fp);
printf("after fclose: %s\n",(long)strlen(buf));
return 0;
}
观察内存流的写入操作
书上说Linux支持,但是其他不支持。目前Mac 10.13也支持。
#include <stdio.h>
FILE *open_memstream( char **bufp,size_t *sizep);
#include <wchar.h>
FILE *open_wmemstream(wchar_t **bufp,size_t sizep);
原则:
第一、缓冲区地址和长度只有在调用fclose或fflush后才有效;
第二、这些值只有在下一次写入或调用fclose前才有效。
标准I/O替代软件
标准I/O库的一个不足之处就是效率不高,这与他需要复制的数据量有关。一次是在内核和标准I/O缓冲区之间(当调用read和write时),第二次是在标准I/O缓冲区和用户程序中的行缓冲之间。
有快速I/O、sfio、ASI(Alloc Stream Interface)。
许多标准I/O库实现在C函数库中可用,这种C函数库是为内存较小的系统,如嵌入式系统设计的。uClibc C库和Newlib C库。