如何捕获 printf 的输出
How to capture output of printf?
我正在调用funcA
funcB
函数。 funcB
使用多个printf
语句来输出数据。有没有办法让我通过funcA
捕获这些数据?我无法修改funcB
.
funcB(){
printf( "%s", "My Name is" );
printf( "%s", "I like ice cream" );
}
funcA(){
funcB();
}
(此答案是基于此答案的更正版本。
这个答案是以POSIX为中心的。使用 open
为要重定向到的文件创建文件描述符。然后,使用 dup2
to STDOUT_FILENO
更改stdout
以改为写入文件。但是,您需要在执行此操作之前dup
STDOUT_FILENO
,以便您可以使用其他dup2
恢复stdout
。
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: %sn", 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++的范围,取决于操作系统。
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- Printf 和 Echo 提供不同的输出
- CUDA内核printf()在终端中不产生输出,在探查器中工作
- 为什么在杂注 omp 关键之后多次调用 printf 会产生乱码输出?
- 如何捕获C 功能printf()的输出
- 为什么printf和cout为此无符号int提供了不同的输出
- 为什么 printf 函数在以下代码中显示所需的输出
- 如何将 printf 流输出重定向到.csv文件
- 整数输出格式.什么是 printf(%.3x) 的类似物
- 在QT中的主窗口中显示printf输出
- Win32应用程序使用printf将输出写入控制台
- printf( "%d %dn" ,i++,i++) 输出
- 为什么这段使用 printf 和 cout 的代码没有预期的输出?
- 在打印相同的变量时为 cout 和 printf 获取不同的输出
- 带有printf的C++奇怪输出
- printf输出不受全局区域设置的影响
- 为什么 printf() 在指针中显示与 cout 不同的地址输出C++
- cout 没有输出,但 printf 有
- 如何捕获 printf 的输出
- 将 printf C++控制台输出重定向到 C#