gpt4 book ai didi

c - 从 C 程序中通过管道将终端输出输出到文件

转载 作者:行者123 更新时间:2023-11-30 17:14:49 25 4
gpt4 key购买 nike

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

 myprogram.exe 1>logfile.txt
例如。但我想知道是否有办法从 C 代码本身中做到这一点。 printf() 系列中是否有一个函数可以使用相同的参数输出到终端和指定文件?

如果不是,那么编写我自己的 printf() 风格的函数所需的语法是什么,该函数在其中调用 printf() 和 fprintf(),并使用与 printf() 相同的参数样式?

最佳答案

放弃使用可变参数函数的建议:

#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() 可能仍保持已定义状态。

关于c - 从 C 程序中通过管道将终端输出输出到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30172932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com