有没有办法修改printf
以便在文件而不是控制台上输出字符串?
我尝试在互联网上查找内容,发现可能与此相关的dup
,dup2
和fflush
等来电。
编辑:
也许我不清楚..事情是这是在C考试中的问题..问题如下:
解释如何通常将字符串输出到屏幕(使用printf()
)的程序如何将字符串输出到文件,不用更改上述程序中的任何代码。
答案 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
。
答案 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并将其分配给第一个参数。