4

これは私の最初の質問なので、できるだけ詳しく説明します。現在、C で記述された別のプログラム (StringGen と呼びます) をテストする C# プログラム (TestProgram と呼びます) に取り組んでいます。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 に入力を与えていないようで、StringGen が出力を返さないため、システムは ReadLine でハングします。コマンドラインで StringGen を実行してみましたが、正常に動作し、キーボードからの入力を受け取り、正しい文字列を出力します。私は考えられるすべてを試し、このサイトや解決策を見つけようとして他の人を検索しましたが、この種のコードのすべての例は他の人にとってはうまくいくようです. 何が間違っているのかわかりません。TestProgram から StringGen プログラムに入力を送信する方法を誰かが提案できれば、本当に感謝しています。重要なことを省略したり、不明な点があればお知らせください。

注: StringGen で scanf と fgets の両方を試しましたが、どちらも同じ結果になります。

WriteLine() でリテラル文字列を使用しようとしましたが、まだ入力がありません。

TestProgram で Write() と Flush() を使用しようとしましたが、役に立ちませんでした。

フラッシュを強制するために入力バッファを Close() しようとしましたが、これも効果がありません。

StringGen でテストを実行するために他の誰かのコードを編集しているため、C# にはあまり詳しくありません。

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);
}

そして、次のコードは「I received 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 に答える