I\'m looking for a way to pass in a FILE *
to some function so that the function can write to it with fprintf
. This is easy if I want the output t
I'm not sure if it's possible to non-portably extend FILE
objects, but if you are looking for something a little bit more POSIX friendly, you can use pipe
and fdopen
.
It's not exactly the same as having a FILE*
that returns bytes from a buffer, but it certainly is a FILE*
with programmatically determined contents.
int fd[2];
FILE *in_pipe;
if (pipe(fd))
{
/* TODO: handle error */
}
in_pipe = fdopen(fd[0], "r");
if (!in_pipe)
{
/* TODO: handle error */
}
From there you will want to write your buffer into fd[1]
using write()
. Careful with this step, though, because write()
may block if the pipe's buffer is full (i.e. someone needs to read the other end), and you might get EINTR
if your process gets a signal while writing. Also watch out for SIGPIPE
, which happens when the other end closes the pipe. Maybe for your use you might want to do the write
of the buffer in a separate thread to avoid blocking and make sure you handle SIGPIPE
.
Of course, this won't create a seekable FILE*
...