4

这是我在这里的第一个问题,所以我会尽可能详细。我目前正在开发一个 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;
}

这是我将 StringGen 定义为进程的 C# 代码:

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 上执行测试。

4

2 回答 2

5

我认为问题出在您的 C 程序中,而不是在您的 C# 程序中。当你产生你的输出时,你不会把它放在\n最后。因此StandardOutput.ReadLine()将永远等待,因为流中没有行尾标记。

由于 C 程序的输出用于同步协作程序的步骤,因此在等待下一部分输入之前将其刷新到输出也是一个非常好的主意:

printf("%s\n", result);
fflush(stdout);
于 2012-07-02T12:15:55.460 回答
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();
}
于 2012-07-02T12:36:16.457 回答