C modifying printf () to output to a file

30,448

Solution 1

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

Solution 2

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;

Solution 3

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

Solution 4

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.

Solution 5

Use either sprintf to write to a string, then to a file, or fprintf directly.

http://linux.die.net/man/3/fprintf

Share:
30,448
user1317277
Author by

user1317277

Updated on July 10, 2022

Comments

  • user1317277
    user1317277 almost 2 years

    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.