2

如何在 C++ 中重载/覆盖 printf 以使以下内容为真:

  1. 打印到 STDOUT 的每一行都以我选择的字符开头或结尾。

  2. 对 printf 的调用不会被掩盖——也就是说,我需要能够调用 printf 并修改每一行。我不想叫“myPrintf”或类似的东西。

背景

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

问题是詹金斯,当它给我构建的输出时,并没有以可编写脚本的方式标记我的程序的输出 - 即,它与我的其他构建步骤的输出以及一般詹金斯一样乱码输出。

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

编辑

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

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

4

1 回答 1

1

最方便的方法:

#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.)
.....

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

于 2013-07-30T01:22:12.000 回答