C修改printf()以输出到文件

时间:2012-06-08 10:42:03

标签: c linux unix printf

有没有办法修改printf以便在文件而不是控制台上输出字符串?

我尝试在互联网上查找内容,发现可能与此相关的dupdup2fflush等来电。

编辑:

也许我不清楚..事情是这是在C考试中的问题..问题如下:

解释如何通常将字符串输出到屏幕(使用printf())的程序如何将字符串输出到文件,不用更改上述程序中的任何代码。

5 个答案:

答案 0 :(得分:11)

如果您无权修改打印的源代码,可以使用stdout上的freopen重定向到文件:

stdout = freopen("my_log.txt", "w", stdout);

然而,这与黑客接壤,因为命令行重定向将停止按预期工作。如果您可以访问执行打印的代码,则首选使用fprintf

您还可以临时切换stdout进行函数调用,然后将其放回原位:

FILE *saved = stdout;
stdout = fopen("log.txt", "a");
call_function_that_prints_to_stdout();
fclose(stdout);
stdout = saved;

答案 1 :(得分:5)

这通常通过I / O重定向(...>文件)完成。

检查这个小程序:

#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

答案 2 :(得分:2)

其他答案无法解决不更改任何代码的问题。

因此,根据环境的不同,在调用程序时,唯一剩下的就是stdout重定向。

./program > target_file

答案 3 :(得分:1)

使用sprintf写入字符串,然后写入文件,或直接fprintf

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

答案 4 :(得分:1)

咨询了讲师,这是(讲师本人)提供的正确解决方案:

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
}

dup2背后的逻辑:这里stdout被设置为newFile的副本,这意味着FD 0现在实际上是用户需要的文件,而不是控制台。这是因为dup 2的默认行为是关闭第二个参数的filedescriptor并将其分配给第一个参数。