gpt4 book ai didi

c++ - 前置或附加到每个 printf 调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:54 25 4
gpt4 key购买 nike

如何在 C++ 中重载/覆盖 printf 以使其满足以下条件:

  1. 打印到 STDOUT 的每一行都带有前缀或附加我选择的字符。

  2. 对 printf 的调用没有被遮挡 -即,我需要能够调用 printf 并修改每一行。我不想调用“myPrintf”或类似的东西。

背景

我正在拼命地尝试能够构建和查看使用 *nix 系统中的 DXGI API 的程序的标准文本输出。我通过我的 Windows 系统上的 SSH 服务器、Jenkins 和 Jenkins CLI 的组合使用它。

问题是,当 Jenkins 向我提供构建的输出时,它不会以可编写脚本的方式标记我的程序的输出——即,它与我其他构建步骤的输出以及一般的 Jenkins 输出。

我希望能够以某种方式用一些已知的字符集标记我程序输出的每一行——这将允许我通过 grep 管道输出我的命令并获得我的程序的实际日志。通过保持 printf 调用不受干扰,我还可以使用宏定义切换此调试输出。

编辑

我愿意接受其他建议 - 以某种方式标记我的可执行文件的输出绝对也是一种选择,但它需要使用适用于 Windows 服务器的功能。

基本上,我可以在我的 *nix 机器上输入“make test”,它会构建并给我(当前被遮盖的)测试输出,就像它是本地的一样,但编译和执行是实际上发生在远程。这太棒了 - 对我来说,最后一步是消除测试输出的模糊。

最佳答案

最方便的方式:

#include <stdio.h>
#include <stdarg.h>
using namespace std;
int taggedPrintf(const char * format, ...){
printf("[PRE]");
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
printf("[POST]\n");
}
#define printf taggedPrintf

int main()
{
printf("your usual message");
printf("Testing numbers %d %f", 1,0.2);
return 0;
}

另一种方式:(快速)您可以尝试定义缩写:

#define PRE printf("[PREFIX]");
#define POST printf("[SUFFIX]\n");

int main()
{
PRE
printf("your usual message");
POST
return 0;
}

另一种方法:将标准输出重定向到空设备以阻止屏幕输出

freopen("/dev/null", "a", stdout);

定义一个大字符串缓冲区

char largeBuffer[LARGE_ENOUGH];

使用 setbuf 将所有内容发送到此缓冲区

setbuf(stdout, largeBuffer);

.....
(Use printf as usual.)
.....

最后,您需要将标记附加到每一行或整个输出并取消重定向,最后打印标记的流。

关于c++ - 前置或附加到每个 printf 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936786/

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