有没有修改的方式printf
,以输出字符串上的文件,而不是到控制台?
我试着在网上找了一些东西,发现类似这样的调用dup
, dup2
和fflush
可能与此有关。
编辑:
也许我不清楚..事情是,这是在C考试的问题..问题如下:
解释如何,通常输出字符串画面(使用程序printf()
可以输出字符串进行到一个文件, 而不在所提到的程序改变任何代码。
有没有修改的方式printf
,以输出字符串上的文件,而不是到控制台?
我试着在网上找了一些东西,发现类似这样的调用dup
, dup2
和fflush
可能与此有关。
编辑:
也许我不清楚..事情是,这是在C考试的问题..问题如下:
解释如何,通常输出字符串画面(使用程序printf()
可以输出字符串进行到一个文件, 而不在所提到的程序改变任何代码。
这通常是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
如果你没有自由修改源代码,不会打印,您可以使用freopen
在stdout
重定向到一个文件:
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;
其他答案不不改变任何代码的这一难题。
因此,根据不同的环境中,是唯一剩下的东西是调用程序时,标准输出重定向。
./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背后逻辑:这里标准输出设置为NEWFILE的副本,这意味着FD 0是现在实际上是用户所需要的文件,而不是控制台。 这是因为DUP 2的默认行为是关闭的第二个参数的文件描述符,并将其分配到的第一个参数。