我正在调用一个函数
funcB
。使用多个语句来输出数据。有没有办法让我通过 捕获这些数据?我不能修改。funcA
funcB
printf
funcA
funcB
funcB(){
printf( "%s", "My Name is" );
printf( "%s", "I like ice cream" );
}
funcA(){
funcB();
}
(此答案是基于此答案的更正版本。)
这个答案是以 POSIX 为中心的。用于open
为要重定向到的文件创建文件描述符。然后,使用dup2
toSTDOUT_FILENO
改为stdout
写入文件。dup
但是,在STDOUT_FILENO
你这样做之前你会想要,所以你可以stdout
用另一个dup2
.
fflush(stdout);
int stdout_fd = dup(STDOUT_FILENO);
int redir_fd = open(redirected_filename, O_WRONLY);
dup2(redir_fd, STDOUT_FILENO);
close(redir_fd);
funcB();
fflush(stdout);
dup2(stdout_fd, STDOUT_FILENO);
close(stdout_fd);
如果funcB
正在使用std::cout
,请使用std::cout.flush()
代替fflush(stdout)
。
如果您想更直接地操作 C++ 流,可以使用Johnathan Wakely 的答案。
如果您的程序中没有其他内容使用printf
,您可以编写自己的版本并显式链接它。如果函数已经定义,链接器将不会在标准库中查找。您可能可以vsprintf
用于实现,或者一些更安全的版本,如果它是由您的编译器提供的,则会检查溢出。
如果你愿意玩一个肮脏的游戏,printf
你可以“窃取”它的输出,比如:
#include <stdio.h>
#include <stdarg.h>
static char buffer[1024];
static char *next = buffer;
static void funcB(){
printf( "%s", "My Name is" );
printf( "%s", "I like ice cream" );
}
static void funcA(){
funcB();
// Do stuff iwth buffer here
fprintf(stderr, "stole: %s\n", buffer);
next=buffer; // reset for later.
}
int main() {
funcA();
}
int printf(const char *fmt, ...) {
va_list argp;
va_start(argp, fmt);
const int ret = vsnprintf(next, sizeof buffer-(next-buffer), fmt, argp);
next += ret;
va_end(argp);
return ret;
}
您可以使用标志来指示如何处理您希望 printf 正常工作的实例。(例如,将其映射到fprintf
或使用dlsym()
/similar 来查找真正的呼叫)。
您还可以使用它realloc
来更明智地管理缓冲区的大小。
放入funcB
一个单独的程序。然后,您可以捕获其标准输出,例如通过管道或将其重定向到文件。如何做到这一点通常取决于操作系统,并且超出了 C++ 的范围。
或者,也许您可以将funcA
进程的标准输出重定向到文件,然后调用FuncB
并从文件中检索输出。
同样,如何做到这一点超出了 C++ 的范围,并且取决于操作系统。