将FILE * struct映射到缓冲区?

时间:2012-02-22 19:29:10

标签: c file buffer

我正在使用一些使用类似内容的遗留代码:

void store_data(FILE *file);

但是,我不想在磁盘上存储数据,我想将其存储在内存中(char *buf)。我可以编辑所有代码,但代码会在整个地方跳转,fwrite会在整个地方调用文件。那么有一种更简单的方法,例如我可以将FILE*对象映射到(自动增长)缓冲区吗? 我不知道之前数据的总大小。

解决方案必须是便携式的。

5 个答案:

答案 0 :(得分:5)

仅使用C标准中提供的功能无法做到这一点。你最接近的是

FILE *scratch = tmpfile();
...
store_data(scratch);
...
/* after you're completely done calling the legacy code */
rewind(scratch);
buf = read_into_memory_buffer(scratch);
fclose(scratch);

这确实击中了磁盘,至少是可能的,但我认为如果你需要广泛的可移植性并且不能修改“遗留代码”,这是你最好的选择。

在POSIX.1-2008中,有open_memstream,它完全符合您的要求;但是,POSIX的这一修订尚未被广泛采用。 GNU libc(在Linux和其他一些用户上使用)有它,但据我所知,它在OSX或* BSD上不可用,当然也不在Windows上。

答案 1 :(得分:1)

您可能希望查看fmemopenopen_memstream。他们朝着你想要的方向做点什么。

从手册页:

  

open_memstream()函数打开一个用于写入缓冲区的流。   缓冲区是动态分配的(与malloc(3)一样),并且自动化   cally按要求增长。关闭流后,调用者应该   free(3)这个缓冲区。

答案 2 :(得分:1)

我不知道这是一个的想法,但这是一个想法。

您可以使用宏“重新定义”fwrite。

#define fwrite(a, b, c) your_memory_write_function(a, b, c)

然后实现memory_write_function将数据写入自动增长缓冲区而不是文件。

您需要使用指向其他内容的指针调用store_data(不是指向FILE的指针)。但是 C 可以实现这一点,因此您不会遇到任何问题。

答案 3 :(得分:0)

您可能需要查看fmemopen()。如果您无法使用,则可以使用命名共享内存段和fdopen()shm_open()返回的文件描述符转换为FILE*

答案 4 :(得分:0)

你在哪个平台上运行?你不能使用tmpfs吗?如果你在tmpfs上打开一个文件,从内核的角度来看,它不是常规文件,而是写入内存吗?