Dlaczego Process.StandardInput.WriteLine nie dostarcza danych wejściowych do mojego procesu?
to jest moje pierwsze pytanie tutaj, więc będę jak najbardziej szczegółowy. Obecnie pracuję nad programem C # (nazwijmy go TestProgram), który testuje inny program napisany w C (który będę nazywał StringGen). TestProgram ma uruchamiać StringGen w oknie poleceń, następnie podawać mu zestaw łańcuchów wejściowych i zapisywać dane wyjściowe dla każdego z nich. Po uruchomieniu StringGen uruchamia pętlę while, która czeka na dane wejściowe, przekazuje dane wejściowe do funkcji przetwarzania, a następnie zwraca wynik.
Mój problem pochodzi z tego, że próbuję wysłać TestProgram do StringGen. Zaczynam StringGen jako proces i próbuję go zasilić za pomocą Process.StandardInput.WriteLine (), a następnie szukam danych wyjściowych za pomocą Process.StandardOutput.ReadLine (). Zanim przejdę dalej, podam kod.
Oto główna funkcja 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;
}
Oto kod C #, w którym definiuję StringGen jako proces:
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();
Następnie korzystam z tego procesu w następujący sposób:
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
}
}
}
Wydaje się, że polecenie WriteLine nie daje żadnych danych wejściowych do StringGen, więc system zawiesza się w ReadLine, ponieważ StringGen nie przekazuje żadnych danych wyjściowych. Próbowałem uruchomić StringGen w wierszu poleceń i działa dobrze, pobiera dane z klawiatury i wyświetla prawidłowe ciągi znaków. Wypróbowałem wszystko, co mogę wymyślić i przeszukać na tej stronie, a inni próbowali znaleźć rozwiązanie, ale każdy przykład tego rodzaju kodu wydaje się działać dobrze dla wszystkich innych. Nie widzę, co robię źle. Jeśli ktoś mógłby zasugerować sposób, w jaki mogę przesłać dane wejściowe do mojego programu StringGen z TestProgram, byłbym naprawdę wdzięczny. Jeśli zostawiłem coś ważnego lub coś jest niejasne, daj mi znać.
Uwagi: Wypróbowałem zarówno skaner, jak i fgets w StringGen, oba dają ten sam rezultat.
Próbowałem użyć dosłownego ciągu z WriteLine (), ale nadal nie ma danych wejściowych.
Próbowałem użyć Write () i Flush () w TestProgram, ale bezskutecznie.
Próbowałem zamknąć () bufor wejściowy, aby wymusić kolor, ale to też nie ma żadnego efektu.
Nie jestem zbytnio zaznajomiony z C #, ponieważ edytuję kod innej osoby do wykonywania testów na StringGen.