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

有没有办法修改printf为了在文件上而不是在控制台上输出string?

我试图在互联网上查找一些东西,发现像dupdup2fflush可能与此相关的调用。

编辑:

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

请解释一下如何将一个正常输出string的程序(使用printf() )输出到一个文件中, 而不用改变上述程序中的任何代码。

这通常通过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 

如果您无权修改打印的源代码,则可以在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; 

其他答案不能解决不改变任何代码的问题。

所以,根据环境的不同,剩下的唯一东西就是调用程序时的stdout重定向。

 ./program > target_file 

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

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

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

 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并将其分配给第一个参数。