glibc 中的 fmemopen() 和 open_memstream() 函数可以实现在一段内存上进行 IO 操作,它们的返回值都是 FILE * 类型,利用这个文件指针,可以调用 fwrite()、fread() 等流操作函数,操作结果可以反映到这段内存中。它们的区别是 fmemopen() 需要调用者提供一段已经分配好的内存(也可以通过传入NULL而让函数自己去申请内存),open_memstream() 函数可以为用户动态申请和扩展内存,并将内存大小通过参数返回。
fmemopen() 使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *write_to_buf(char *msg)
{
char *buf = (char *)malloc(1024);
FILE *fp = fmemopen(buf, 1024, "w");
fwrite(msg, 1, strlen(msg), fp);
fclose(fp);
return buf;
}
int main(void)
{
char *str = "hello, world!";
char *buf = write_to_buf(str);
printf("%s\n", buf);
free(buf);
return 0;
}
open_memstream() 使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *write_to_buf(char *msg)
{
char *buf = NULL;
size_t size = 0;
FILE *fp = open_memstream(&buf, &size);
fwrite(msg, 1, strlen(msg), fp);
fclose(fp);
return buf;
}
int main(void)
{
char *str = "hello, world!";
char *buf = write_to_buf(str);
printf("%s\n", buf);
free(buf);
return 0;
}