Reputation: 113
Is there a way to modify the printf
in order to output string on a file rather than to the console?
I tried looking up something on the Internet and found calls like dup
, dup2
and fflush
that might be associated with this.
EDIT:
Maybe I wasn't clear.. the thing is that this was in a C exam question.. the question is as follows:
Explain how a program that normally output strings to screen (using printf()
) can be made to output string to a file, without changing any code in the mentioned program.
Upvotes: 5
Views: 32652
Reputation: 149
Because file use buffers, just use fflush(STDOUT_FILENO)
after printf
Upvotes: 0
Reputation: 2001
The lecturer was consulted and this was the correct solution provided (by the lecturer himself):
int main {
int newFile = open(desiredFilePath, O_WRONLY)
if ((fork())==0) {
dup2(newFile,stdout) // Explained below
close newFile
Set stdout as CLOSE_ON_EXEC false
exec the user program
}
else{
Wait for child
}
return 0
}
The logic behind dup2: here stdout is set as a copy of newFile, meaning that FD 0 is now actually the user required file and not the console. This is because the default behavior of dup 2 is to close the second parameter’s filedescriptor and assign it to the first parameter.
Upvotes: 2
Reputation: 726479
If you do not have liberty to modify the source code that does printing, you can use freopen
on stdout
to redirect to a file:
stdout = freopen("my_log.txt", "w", stdout);
This borders on a hack, however, because command-line redirects will stop working as expected. If you do have access to the code that does printing, using fprintf
is preferred.
You can also switch your stdout
temporarily for a function call, and then put it back:
FILE *saved = stdout;
stdout = fopen("log.txt", "a");
call_function_that_prints_to_stdout();
fclose(stdout);
stdout = saved;
Upvotes: 12
Reputation: 5702
This is usually done with I/O-redirection (... >file).
Check this little program:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
if (isatty (fileno (stdout)))
fprintf (stderr, "output goes to terminal\n");
else
fprintf (stderr, "output goes to file\n");
return 0;
}
ottj@NBL3-AEY55:~ $ ./x
output goes to terminal
ottj@NBL3-AEY55:~ $ ./x >yy
output goes to file
Upvotes: 6
Reputation: 91017
The other answers don't cope with the problem of not changing any code.
So, depending on the environment, the only thing that is left is stdout redirection when calling the program.
./program > target_file
Upvotes: 3
Reputation: 11547
Use either sprintf
to write to a string, then to a file, or fprintf
directly.
http://linux.die.net/man/3/fprintf
Upvotes: 1