为什么Process.StandardInput.WriteLine不提供输入到我的过程吗?(Why

2019-06-26 00:03发布

这是我在这里的第一个问题,所以我会尽可能详细,我可以。 我目前工作的一个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程序,我将非常感激。 如果我走任何东西了,或者如果有不清楚的地方很重要,请让我知道。

注:我曾经尝试都scanf函数和与fgets在StringGen,都产生相同的结果。

我已经使用文本字符串的WriteLine()试过了,但仍然没有投入。

我曾尝试在TestProgram但无济于事期运用写()和flush()。

我曾试图关闭()输入缓冲区强制冲洗,但这并没有影响无论是。

我不是太熟悉C#,因为我编辑别人的代码在StringGen进行测试。

Answer 1:

我认为这个问题是在你的C程序,而不是在你的C#程序。 当你出示你的输出,你不把\n结尾。 因此StandardOutput.ReadLine()将永远等待,因为有结束的线没有标记的信息流中。

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

printf("%s\n", result);
fflush(stdout);


Answer 2:

C#代码似乎就好了,我用另一个C#程序试了一下:

static void Main(string[] args)
{
    String line = Console.ReadLine();
    Console.WriteLine("I received " + line);
}

而下面的代码输出,“我收到了世界,你好!”。 所以这个问题必须在你的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();
}


文章来源: Why is Process.StandardInput.WriteLine not supplying input to my process?
标签: c# c input process