How to capture output of printf?

(This answer is a corrected version based on this answer.)

This answer is POSIX centric. Use open to create a file descriptor for the file you want to redirect to. Then, use dup2 to STDOUT_FILENO to change stdout to write to the file instead. But, you'll want to dup the STDOUT_FILENO before you do that, so you can restore stdout with another dup2.

fflush(stdout);
int stdout_fd = dup(STDOUT_FILENO);
int redir_fd = open(redirected_filename, O_WRONLY);
dup2(redir_fd, STDOUT_FILENO);
close(redir_fd);
funcB();
fflush(stdout);
dup2(stdout_fd, STDOUT_FILENO);
close(stdout_fd);

If funcB is using std::cout, use std::cout.flush() instead of fflush(stdout).

If you want to manipulate C++ streams more directly, you can use Johnathan Wakely's answer.

Tags:

C++

Printf