C# 如何捕获C++;函数printf()

C# 如何捕获C++;函数printf(),c#,c++,printf,C#,C++,Printf,我以前做过,但是已经有一段时间了,我在寻找相关的例子时遇到了问题。我有一个遗留代码: namespace LegacyUtil { public ref class Calc { public: static int Combos(int s) { int t = 0; // bunch of irrelevant loops printf("%c%d %c%d

我以前做过,但是已经有一段时间了,我在寻找相关的例子时遇到了问题。我有一个遗留代码:

namespace LegacyUtil {    
    public ref class Calc
    {
    public:
        static int Combos(int s)
        {
            int t = 0;
            // bunch of irrelevant loops
            printf("%c%d %c%d D%d\n", m, b, a, d, z);
            t++;
            return t;
        }
    };
}
注:如果有,我可以在Visual C++中编辑/重新编译,但是我必须跳过至少一个环。< /P> <我的问题:我如何捕获C++代码中对Prtff()的输出调用?我有以下代码:

int test = LegacyUtil.Calc.Combos(1040);

执行成功,但我只返回整数,并且我想要字符串输出。请帮忙

如果您决定不更改原始源代码,您可以(我很高兴这样称呼)将自己的代码破解到
printf
的位置。但要谨慎行事,并预见问题

printf
是一个库调用。如果您编写自己的
printf
,并确保它位于系统库之前的链接顺序中,则您的版本将优先于系统库被调用

或者,您可以自己定义系统
printf
:所以

#define printf my_print_func

尽管这种文本替换很容易出错,而且事情也会不顺利,但是还有其他提到的不是简单的
printf
调用(例如
sprintf
snprintf
,或者原始代码中定义的其他函数)

printf的输出转到
stdout
,这是一个C文件流(或文件*)。基本上需要将C++代码的STDUT映射到C兼容的流。

< >将C++流重定向到C的控制台输出,可以尝试(参见:):


(注意:我根本没有测试这个)

就我的理解而言,基本上你希望一个程序的输出被另一个程序捕获

使用以下命令创建可执行文件:

#include <stdio.h>

int main()
{
   char line[BUFSIZ];
   while ( fgets(line, BUFSIZ, stdin) != NULL )
   {
      /* Do something with the line of text
   }
}
#包括
int main()
{
字符行[BUFSIZ];
while(fgets(line,BUFSIZ,stdin)!=NULL)
{
/*用这行文字做些什么
}
}

然后,您可以将任何程序的输出通过管道传输到它,逐行读取内容,对每行文本进行处理。

您是否尝试过:
std::stringstream
snprintf
?@ThomasMatthews根本没有尝试过修改遗留代码,希望能够在不修改此代码的情况下捕获输出什么值
组合中的s
您是否尝试返回?@EvanWeissburg您是否看到对printf()的调用?当前输出的字符串长度为11个字符,末尾有换行符。它在一个循环中执行此操作数百次,我需要C#才能访问该字符串。您可以用fprinf替换printf吗?因为fprinf会将输出重定向到一个文件,然后您可以读取该文件以获得输出。现在我们开始讨论!谢谢,我我会回来的我尝试了Reed的解决方案,但不幸的是它不起作用。它不会引发任何错误,但我得到的.txt文件是空的(是的,我确保刷新并关闭流)我认为他的解决方案是为了捕获C的控制台AppNoT 100%的输出而不是改变它,它是可能的,但是我不能记住我的生命如何在C++中做字符串,这个函数的输出长度会长短,如果我必须改变源代码,我会把它改成什么?我想我可以在GETT上进行一次尝试。sprintf()使用char缓冲区,但我一辈子都记不起如何将其返回到C#。我以前是通过两次调用一个C风格的包装函数来完成的,我会编写一个字节数组,返回它所写内容的长度,但如果输入缓冲区为空,则不会实际写入任何内容。因此,第一次调用将获得长度(在本例中,您可以使用printf获得,因为它返回写入的长度),然后设置C#byte数组的大小,然后再次调用写入该数组的封送C样式包装器。
#include <stdio.h>

int main()
{
   char line[BUFSIZ];
   while ( fgets(line, BUFSIZ, stdin) != NULL )
   {
      /* Do something with the line of text
   }
}