我之前已经这样做了,但已经有一段时间了,我在找到任何相关的例子时遇到了问题。我有这个遗留代码:
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);
执行成功,但我只返回返回的整数,我想要字符串输出。请帮忙!
答案 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
sprintf
,snprintf
,或原始代码中定义的其他一些功能)
答案 2 :(得分:0)
就我的理解而言,基本上你希望将一个程序的输出捕获到其他程序中。
使用以下方法创建可执行文件:
#include <stdio.h>
int main()
{
char line[BUFSIZ];
while ( fgets(line, BUFSIZ, stdin) != NULL )
{
/* Do something with the line of text
}
}
然后你可以将任何程序的输出传递给它,逐行读取内容,对每行文本做一些事情。