如何捕获C ++函数printf()的输出

时间:2017-06-27 00:36:02

标签: 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 D%d\n", m, b, a, d, z);
            t++;
            return t;
        }
    };
}

注意:如果需要,我可以在Visual C ++中编辑/重新编译它,但我必须跳过至少一个环。

我的问题:如何从C#代码中捕获对printf()进行的C ++调用的输出?我有这段代码:

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

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

3 个答案:

答案 0 :(得分:1)

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

This answer to another question should help you do that.

要将C ++流重定向到C#控制台输出,您可以尝试(参见:Redirecting Console.Out):

// courtesy of Reed Copsey
[DllImport("Kernel32.dll", SetLastError = true) ]
public static extern int SetStdHandle(int device, IntPtr handle);
...
consoleStream = new FileStream(Console.OpenStandardOutput());
SetStdHandle(-11, consoleStream.handle);

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

答案 1 :(得分:0)

如果您确定不更改原始源代码,则可以 hack (我很高兴将其称之为)您自己的代码放入{{1 }}。但请谨慎行事,并预测问题。

printf是一个图书馆电话。如果您编写了拥有 printf,并确保它在系统库之前的链接顺序中,那么您的版本将优先于系统库调用

或者,printf系统#define可能就足够了:所以

printf

虽然这种文本替换容易出错,但事情会不复存在,其他提及不是#define printf my_print_func printf sprintfsnprintf,或原始代码中定义的其他一些功能)

答案 2 :(得分:0)

就我的理解而言,基本上你希望将一个程序的输出捕获到其他程序中。

使用以下方法创建可执行文件:

#include <stdio.h>

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

然后你可以将任何程序的输出传递给它,逐行读取内容,对每行文本做一些事情。