创建导致字符串的FILE*流

Edm*_*und 5 c string printf file stream

我正在寻找一种方法来传递一个FILE *函数,以便函数可以写入它fprintf.如果我想让输出在磁盘上的实际文件中出现,这很容易.但我想要的是将所有输出作为字符串(char *).我喜欢的那种API是:

/** Create a FILE object that will direct writes into an in-memory buffer. */
FILE *open_string_buffer(void);

/** Get the combined string contents of a FILE created with open_string_buffer
    (result will be allocated using malloc). */
char *get_string_buffer(FILE *buf);

/* Sample usage. */
FILE *buf;
buf = open_string_buffer();
do_some_stuff(buf);   /* do_some_stuff will use fprintf to write to buf */
char *str = get_string_buffer(buf);
fclose(buf);
free(str);
Run Code Online (Sandbox Code Playgroud)

在glibc的头似乎表明,一个文件可能被设置了挂钩函数来执行实际的读写.在我的情况下,我想我希望写钩子将字符串的副本附加到链表,并且有一个get_string_buffer函数可以计算出列表的总长度,为它分配内存,然后将每个项目复制到它在正确的地方.

我的目标是可以传递给函数的东西,比如do_some_stuff没有那个函数需要知道除了FILE *它可以写入之外的任何东西.

是否存在类似这样的现有实现?这似乎是一个有用且C友好的事情 - 假设我对FILE可扩展性是正确的.

qui*_*ars 5

如果可移植性对您不重要,您可以查看fmemopen和open_memstream.它们是GNU扩展,因此只能在glibc系统上使用.虽然看起来它们是POSIX.1-2008(fmemopen和open_memstream)的一部分.