管道终端从C程序内输出到文件

时间:2015-05-11 16:29:22

标签: c file-io printf output

我希望输出到stdout的所有内容也保存在我的C代码中的文件中。我知道我可以通过在命令行上调用进程并将其传递给文件来执行此操作:

 myprogram.exe 1>logfile.txt
例如,

。但我想知道是否有办法在C代码本身内做到这一点。 printf()系列中是否有一个函数可以输出到终端和具有相同参数的指定文件?

如果没有,编写我自己的printf()样式函数所需的语法是什么,该函数使用与printf()相同的参数样式调用printf()和fprintf()?

2 个答案:

答案 0 :(得分:0)

你可以使用fprintf()函数,它与printf()的工作方式非常相似。

以下是一个例子:

FILE *fp;
int var = 5;
fp = fopen("file_name.txt", "w");// "w" means that we are going to write on this file
fprintf(fp, "Writting to the file. This is an int variable: %d", var);

您文件的输出将是:

This is being written in the file. This is an int variable: 5

N.B:使用 w 打开文件作为参数将在每次打开时销毁文件的内容。

要写入文件,必须使用文件操作命令,不能使用printf写入文件(它只能打印到stdout)。您可以使用:

sprintf(buf,"%d",var);  //for storing in the buffer
printf(buf);       //output to stdout
fputs(buf, fp);   //output to file

答案 1 :(得分:0)

取消建议使用可变参数函数:

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

/*
 * Not all compilers provide va_copy(), but __va_copy() is a
 * relatively common pre-C99 extension.
 */
#ifndef va_copy
#ifdef __va_copy
#define va_copy(dst, src) __va_copy((dst), (src))
#endif
#endif

#ifdef va_copy
#define HAVE_VACOPY 1
#endif

int
ftee(FILE *outfile, const char *format, ...)
{
    int result;
    va_list ap;
#if HAVE_VACOPY
    va_list ap_copy;
#endif

    va_start(ap, format);

#if HAVE_VACOPY
    va_copy(ap_copy, ap);
    result = vfprintf(outfile, format, ap_copy);
    va_end(ap_copy);
    if (result >= 0)
        result = vprintf(format, ap);
#else
    result = vfprintf(outfile, format, ap);
    if (result >= 0) {
        va_end(ap);
        va_start(ap, outfile);
        result = vprintf(format, ap);
    }
#endif
    va_end(ap);
    return result;
}

可以像标准fprintf函数一样使用它来指定输出文件,但它也会将正常输出写入stdout。我试图支持相对较新的编译器,这些编译器仍然没有va_copy()宏(在C99中定义),例如Visual Studio 2012附带的宏(VS2013最终有一个)。某些C运行时还有条件地定义va_copy(),这样在启用严格的C89 / C90模式的情况下进行编译将使其未定义,而__va_copy()可以保持定义。