C#如何获得另一个控制台应用程序的输出

控制台应用程序是C++写的,主体是一个while的死循环,每接收一行输入就会有一行输出,接收特定的命令后退出。( 比如 while(1) { scanf("%d%d",&a,&b);if(a==0&&b==0) break;else printf("%d\n",a+b); } //实例中当然不会这么简单,只是该程序已经写死,无法修改了),然后我就在C#里面用一个Process类对象,重定义该控制台应用程序的输入输出,但是实践中发现控制台应用程序在退出前是无法获得其标准化输出的,就是说还在while循环体里面的话,在C#程序里面调试的时候会卡在读取的那行代码。我现在想在C#程序里面操控这个控制台应用程序的输入输出,每发送一行命令即获得该命令的执行结果而不要等控制台应用程序退出,请问该如何实现?
我把我测试的代码贴出来,大家帮我看看哪里应该修改(C#部分)。
C++代码
#include <stdio.h>
void main()
{
int a,b;
while(1)
{
scanf("%d%d",&a,&b);
if(a==0&&b==0) return;
printf("%d+%d=%d\n",a,b,a+b);
}
}

C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
namespace Test
{
class Program
{
static void Main(string[] args)
{
string result;
Process p = new Process();
p.StartInfo.FileName = @"C:\\a.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.Start();
p.StandardInput.WriteLine("1 2");
p.StandardInput.Flush();
result = p.StandardOutput.ReadLine();
Console.WriteLine(result);
Console.ReadKey();
}
}
}

第1个回答  2012-05-03
Process p = new Process();
p.StartInfo.FileName = @"";//控制台程序的路径
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.Start();

p.StandardInput.WriteLine("");
p.StandardOutput.ReadLine();追问

不知道你试过没有,反正我是试过的,这样是读不到的,因为在控制台退出之前是无法得到标准输出的。

追答

Process p = new Process();
p.StartInfo.FileName = @"";//控制台程序的路径
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.Start();

p.StandardInput.WriteLine(" ");
p.StandardInput.Flush();
string result = p.StandardOutput.ReadLine();
Console.WriteLine(result);
Console.ReadKey();
输入之后,加了句p.StandardInput.Flush();,反正我测试,可以的。
C#用ReadLine(),C++里输出后,确保有换行,不然会认为一行没有输出完的,所以ReadLine()就读不到了;如果C++输出结尾没有换行,C#就用Read()读。

追问

我把我测试的代码贴到问题补充里面了,C++部分不能更改,然后按照你的说法写的C#程序运行的时候就是卡在ReadLine那行而得不到结果,只有改为WriteLine("0 0")的时候才会正确返回。诚心请教是哪里的问题,谢谢!

追答

C#的WriteLine()输入的内容,用C语言的scanf()接受有问题,明明是整形,C语言处理为字符了。你改用C++吧,我试过C++,cin>> 可以的。
你现在的C语言代码,如果输入俩字符的话,就会出现死循环,不断地输出。而且在C#调用的时候,a.exe进程很占CPU,说明跟输入字符是一个样子的。

本回答被提问者采纳
第2个回答  2012-05-02
这个是跨线程了,可以使用一个中间只进行数据的传输如文件 数据库 两个控制台 同时监听。追问

问题是C++程序没有源代码,无法修改。否则直接转为C#岂不更容易?还是说不需要对控制台进行处理就可以实现?能否给个代码或者实例?

第3个回答  2012-05-01
where(1)
{
int a=convert.ToInt32(Console.ReadLine());
int b=convert.ToInt32(Console.ReadLine());
if(a==0&&b==0)
{
Console.WriteLine("请输入两个数:a和b的值");
break;
}
}
else
{
Console.WriteLine("{0}+{1}={2}",a,b,a+b);

}追问

看来你没有看题目啊,我已经不忍心追问你了,感谢你来回答吧,我还是等其他高人吧~

追答

where(true)
{
int a=convert.ToInt32(Console.ReadLine());
int b=convert.ToInt32(Console.ReadLine());
if(a==0&&b==0)
{
Console.WriteLine("请输入两个数:a和b的值");
break;
}
}
else
{
Console.WriteLine("{0}+{1}={2}",a,b,a+b);

}

第4个回答  2012-05-03
使用进程的OutputDataReceived事件可能对你这个问题有帮助
第5个回答  2012-05-02
相似回答