我正在使用一些类似以下内容的旧代码:
void store_data(FILE *file);
但是,我不想将数据存储在磁盘上,而是想将其存储在内存中(
char *buf
)。我可以编辑所有代码,但是代码会在整个地方跳转,并且fwrite
在整个地方都在文件上被调用。那么有没有更简单的方法,例如我可以将FILE*
对象映射到(自动增长的)缓冲区? 我之前不知道数据的总大小。 解决方案必须是可移植的。
最佳答案
仅使用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和其他一些Linux上使用)具有它,但据我所知它在OSX或* BSD上不可用,当然在Windows上也不可用。关于c - 使FILE *结构映射到缓冲区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9401613/