Maybe I'm just missing it, but isn't there a function equivalent to fprintf for file descriptors, or even a way to temporarily flip-flop between them?
You could look into dprintf
(GNU extensions, not in C or POSIX) :
The functions dprintf() and vdprintf() (as found in the glibc2 library) are exact analogues of fprintf() and vfprintf(), except that they output to a file descriptor fd instead of to a given stream.
EDIT As pointed by several of you in the comments, POSIX 2008 standardized these functions.