我想知道是否有一种方法可以写入并输出到文件中,并且在没有太多代码行的情况下也可以在屏幕上输出。
我知道如何输出到控制台以及如何输出到文件,但它是一个或另一个,但我想绑定两个,但这样我就不必重复fprintf(stdout,__)一次输出到文件,一次输出到控制台。
我在c工作。
提前致谢。
编辑:虽然我也想知道如何在命令行中执行它,但我认为在代码和命令行中显示它很重要。只是为了显示问题的两种可能的解决方案。它也应该独立于任何特定的操作系统......并且看起来不像发球台。
答案 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);
...