这是我的第一个问题,所以我会尽可能详细。我目前正在开发一个C#程序(我们称之为TestProgram),它测试用C编写的不同程序(我将其称为StringGen)。 TestProgram应该在命令窗口中运行StringGen,然后为它提供一组输入字符串并记录每个输出字符串的输出。运行StringGen时,它会启动一个等待输入的while循环,将该输入提交给处理函数,然后返回结果。
我的问题来自于我尝试让TestProgram向StringGen提交字符串。我将StringGen作为一个进程启动并尝试使用Process.StandardInput.WriteLine()提供输入,然后使用Process.StandardOutput.ReadLine()查找输出。在我进一步阐述之前,我将提供一些代码。
这是StringGen的主要功能:
int main() {
char result[255];
char input[255];
do {
fgets(input, 100, stdin);
result = GetDevices(input); //Returns the string required
printf("%s", result);
} while (input != "quit");
return 0;
}
这是C#代码,我将StringGen定义为一个进程:
Process cmd = new Process();
ProcessStartInfo info = new ProcessStartInfo(command, arguements); // Command is the path to the C executeable for StringGen
info.WorkingDirectory = workingDirectory; // Working Directory is the directory where Command is stored
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
cmd.StartInfo = info;
cmd.Start();
然后我继续使用这个过程:
using (var cmd)
{
// Loop through the input strings
String response;
foreach (exampleString in StringSet) // Loops through each string
{
cmd.StandardInput.WriteLine(exampleString.text); // This is the problem line
response = cmd.StandardOutput.ReadLine(); // System comes to a halt here
cmd.StandardOutput.Close();
if (response == "Something")
{
// Do this
}
else
{
// Do that
}
}
}
WriteLine命令似乎没有给StringGen任何输入,因此系统在ReadLine挂起,因为StringGen没有给出任何输出。我已经尝试在命令行运行StringGen,它工作正常,从键盘输入并输出正确的字符串。我已经尝试了我能想到的所有内容并在整个网站上搜索过,其他人试图找到解决方案,但是这种代码的每个例子似乎都适合其他人。我看不出我做错了什么。如果有人可以提出一种方法,我可以从TestProgram向我的StringGen程序提交输入,我将非常感激。如果我遗漏了任何重要信息,或者有任何不清楚的地方,请告诉我。
注意: 我在StringGen中尝试过scanf和fgets,两者都产生相同的结果。
我尝试使用带有WriteLine()的文字字符串,但仍然没有输入。
我尝试在TestProgram中使用Write()和Flush()但无济于事。
我尝试关闭()输入缓冲区以强制刷新,但这也没有效果。
我对C#并不太熟悉,因为我正在编辑其他代码以对StringGen执行测试。
答案 0 :(得分:5)
我认为问题出在你的C程序中,而不是你的C#程序中。生成输出时,不要将\n
放在最后。因此StandardOutput.ReadLine()
将永远等待,因为流中没有行结束标记。
由于C程序的输出用于同步合作程序的步骤,因此在等待下一部分输入之前将其刷新到输出是一个非常好的主意:
printf("%s\n", result);
fflush(stdout);
答案 1 :(得分:2)
您的C#代码似乎没问题,我尝试了另一个C#程序:
static void Main(string[] args)
{
String line = Console.ReadLine();
Console.WriteLine("I received " + line);
}
以下代码输出“我收到了Hello world!”。所以问题必须在你的C代码中。正如已经提到的dasblinkenlight,可能缺少新的行符号。
static void Main(string[] args)
{
Process cmd = new Process();
ProcessStartInfo info = new ProcessStartInfo(@"AnotherApp.exe", "");
info.WorkingDirectory = @"path\to\folder";
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
cmd.StartInfo = info;
cmd.Start();
cmd.StandardInput.WriteLine("Hello world!");
String output = cmd.StandardOutput.ReadLine();
Console.WriteLine(output);
Console.ReadKey();
}