C 一种将标准输出到屏幕和文件的方法?

C 一种将标准输出到屏幕和文件的方法?,c,file,stdout,C,File,Stdout,我想知道是否有一种方法可以在不需要太多代码行的情况下将文件写入并输出到屏幕上 我知道如何输出到控制台以及如何输出到文件,但这是其中之一,但我想将两者结合起来,这样我就不必重复fprintf(stdout,u u)一次输出到文件,一次输出到控制台 我在c工作 提前谢谢 编辑:虽然我也想知道如何在命令行中进行编辑,但我认为在代码和命令行中显示它很重要。只是为了说明两种可能的解决方案。它也应该独立于任何特定的操作系统。。。而且看起来不像是tee。您可以按如下方式操作: #include <std

我想知道是否有一种方法可以在不需要太多代码行的情况下将文件写入并输出到屏幕上

我知道如何输出到控制台以及如何输出到文件,但这是其中之一,但我想将两者结合起来,这样我就不必重复fprintf(stdout,u u)一次输出到文件,一次输出到控制台

我在c工作

提前谢谢


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

您可以按如下方式操作:

#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;
}
#包括
#包括
无效发送字符串(文件*fd,字符*fmt,…)
{
变量列表参数fd,参数stdout;
va_启动(参数fd、fmt);
va_启动(args_stdout,fmt);
vfprintf(fd、fmt、args_fd);
vfprintf(标准输出、fmt、参数);
fflush(fd);
fflush(stdout);
va_end(args_fd);
va_end(args_stdout);
}
int main()
{
文件*fp=fopen(“out.txt”,“w”);
发送字符串(fp,“你好,”);
发送字符串(fp,“世界%d次!\n”,42);
fclose(fp);
返回0;
}

您可以按如下方式执行:

#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;
}
#包括
#包括
无效发送字符串(文件*fd,字符*fmt,…)
{
变量列表参数fd,参数stdout;
va_启动(参数fd、fmt);
va_启动(args_stdout,fmt);
vfprintf(fd、fmt、args_fd);
vfprintf(标准输出、fmt、参数);
fflush(fd);
fflush(stdout);
va_end(args_fd);
va_end(args_stdout);
}
int main()
{
文件*fp=fopen(“out.txt”,“w”);
发送字符串(fp,“你好,”);
发送字符串(fp,“世界%d次!\n”,42);
fclose(fp);
返回0;
}
正如评论中指出的,您可以使用 答案中显示了执行情况。他们当然很聪明,但我认为你很聪明 无需使用fork和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;
}
正如评论中指出的,您可以使用 答案中显示了执行情况。他们当然很聪明,但我认为你很聪明 无需使用fork和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;
}

最简单的方法是从命令行通过
tee
。如果您需要在应用程序中执行此操作,请检查可能的重复项是否可以执行fprintf(stdout&&filename,“\uu”)…?不,不可能。您首先必须理解
&&
的含义:这是逻辑
运算符,它返回true或false(在C中不是-0或0)。如果两个指针都不是空的,
stdout&&filename
的计算结果为1,那么传递的是不正确的
fprintf(1,…)
。看看答案。最简单的方法是从命令行通过管道
tee
。如果您需要在应用程序中执行此操作,请检查可能的重复项是否可以执行fprintf(stdout&&filename,“\uu”)…?不,不可能。您首先必须理解
&&
的含义:这是逻辑
运算符,它返回true或false(在C中不是-0或0)。如果两个指针都不是空的,
stdout&&filename
的计算结果为1,那么传递的是不正确的
fprintf(1,…)
。看看答案。你的版本很危险,想想如果你发送字符串(fp,“Hello%d”)。这个问题的解决很容易。@Pablo谢谢你指出,我把它改成支持可变参数。呵呵,这也是我的主意。但是我在上一个代码中提到的修复是:而不是
fprintf(fd,str)do<代码>fprintf(fd,“%s”,str)。这就解决了问题。当使用
va_args
时,不要忘记在varidic上调用
va_end
variables@neuro_sys环顾四周后,我能更好地理解它。非常感谢:)您的版本很危险,请思考如果您执行
send_string(fp,“Hello%d”)。这个问题的解决很容易。@Pablo谢谢你指出,我把它改成支持可变参数。呵呵,这也是我的主意。但是我在上一个代码中提到的修复是:而不是
fprintf(fd,str)do<代码>fprintf(fd,“%s”,str)。这就解决了问题。当使用
va_args
时,不要忘记在varidic上调用
va_end
variables@neuro_sys环顾四周后,我能更好地理解它。非常感谢:)