5

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

我尝试在 Internet 上查找某些内容,并找到了类似的电话,dup这可能与此有关。dup2fflush

编辑:

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

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

4

6 回答 6

11

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

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;
于 2012-06-08T10:50:19.320 回答
6

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

检查这个小程序:

#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
于 2012-06-08T11:02:50.750 回答
3

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

因此,根据环境,唯一剩下的就是调用程序时的标准输出重定向。

./program > target_file
于 2012-06-08T11:01:47.253 回答
2

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

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 的默认行为是关闭第二个参数的文件描述符并将其分配给第一个参数。

于 2013-06-08T10:00:22.673 回答
1

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

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

于 2012-06-08T10:44:55.180 回答
0

因为文件使用缓冲区,所以只fflush(STDOUT_FILENO)在 printf 之后使用

于 2021-08-20T05:37:04.410 回答