一种将stdout输出到屏幕和文件的方法吗?

时间:2018-04-21 14:19:08

标签: c file stdout

我想知道是否有一种方法可以写入并输出到文件中,并且在没有太多代码行的情况下也可以在屏幕上输出。

我知道如何输出到控制台以及如何输出到文件,但它是一个或另一个,但我想绑定两个,但这样我就不必重复fprintf(stdout,__)一次输出到文件,一次输出到控制台。

我在c工作。

提前致谢。

编辑:虽然我也想知道如何在命令行中执行它,但我认为在代码和命令行中显示它很重要。只是为了显示问题的两种可能的解决方案。它也应该独立于任何特定的操作系统......并且看起来不像发球台。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

#include <stdio.h>
#include <stdarg.h>


void send_string(FILE *fd, char *fmt, ...)
{
    va_list args_fd, args_stdout;

    va_start(args_fd, fmt);
    va_start(args_stdout, fmt);

    vfprintf(fd, fmt, args_fd);
    vfprintf(stdout, fmt, args_stdout);

    fflush(fd);
    fflush(stdout);

    va_end(args_fd);
    va_end(args_stdout);
}

int main()
{
    FILE *fp = fopen("out.txt", "w");

    send_string(fp, "hello, ");
    send_string(fp, "world %d times!\n", 42);

    fclose(fp);

    return 0;
}

答案 1 :(得分:1)

正如melpomene在评论中指出的那样,你可以使用任何一个 该答案中显示的实现。他们当然很聪明,但我想你 可以做而不必做叉子和popens并依赖外部程序 例如tee,特别是如果您的系统上没有该工具。

我会这样做:

#include <stdarg.h>

int teeprintf(FILE *fp, const char *format, ...)
{
    int ret;
    va_list ap1, ap2;
    va_start(ap1, format);
    va_copy(ap2, ap1);

    vprintf(format, ap1);  // printing on stdout
    ret = vfprintf(fp, format, ap2);
    //fflush(fp);   // <-- you might want if you
                    // want to see the output of the file
                    // immediately

    va_end(ap1);
    va_end(ap2);

    return ret;
}

然后您可以像常规printf

一样使用它
FILE *fp = fopen("/tmp/log", "w");

if(fp == NULL)
    return 1;

teeprintf(fp, "%s %d\n", "Hello World", 3*19);
teeprintf(fp, "fp points to %p\n", (void*) fp);
...