Ç改性的printf(),以输出到文件(C modifying printf () to outpu

2019-09-17 22:10发布

有没有修改的方式printf ,以输出字符串上的文件,而不是到控制台?

我试着在网上找了一些东西,发现类似这样的调用dupdup2fflush可能与此有关。

编辑:

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

解释如何,通常输出字符串画面(使用程序printf()可以输出字符串进行到一个文件, 而不在所提到的程序改变任何代码。

Answer 1:

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


Answer 2:

如果你没有自由修改源代码,不会打印,您可以使用freopenstdout重定向到一个文件:

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;


Answer 3:

其他答案不不改变任何代码的这一难题。

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

./program > target_file


Answer 4:

二者必选其一sprintf写入字符串,然后到一个文件,或者fprintf直接。

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



Answer 5:

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

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



文章来源: C modifying printf () to output to a file