3 Stimmen

mehrfaches lesen aus demselben stream in c#

Ich möchte die Ausgabe meines Programms mehrfach lesen. Wenn ich X übergebe, erhalte ich die Ausgabe und zeige sie an, wenn ich Y übergebe, erhalte ich die Ausgabe und zeige sie an, ohne den Prozess neu zu starten. Um es zu versuchen, habe ich ein C-Programm erstellt

#include<stdio.h>
int main()
{
    int i;
    int j;
while(scanf("%d", &i))
{
    for(j = 0; j<=i;j++)
    printf("%d\n",j);
}
return 0;
}

und jetzt bin ich interfacting es mit C#, wo, wenn ich einen Text in das Textfeld eingeben es durch die Umleitung standardinput (ein Streamwriter) an das Programm übergeben wird und um die Ausgabe zu lesen, rufe ich es standardoutput (ein Streamreader).readtoend().

Aber bei mir funktioniert es nicht. Da es in Wartezustand geht, bis der Strom einige Anzeige sagen Ende gelesen wurde zurückgibt.

Wie kann ich so etwas erreichen?

Ich habe auch das asynchrone Lesen versucht, bei dem ich die Methode beginoutputread aufrufe, aber dann weiß ich nicht, wann das Lesen beendet ist! Eine Möglichkeit besteht darin, in meinem ursprünglichen Programm eine Markierung hinzuzufügen, die anzeigt, dass die Ausgabe für die aktuelle Eingabe beendet ist. Gibt es eine andere Möglichkeit, dies zu erreichen?

11voto

DreamSonic Punkte 1434

Wenn der Stream das Suchen unterstützt ( CanSeek ), können Sie ihn "zurückspulen", indem Sie

stream.Position = 0;

und begann daher, es noch einmal zu lesen.

3voto

Arsen Mkrtchyan Punkte 48540

Wenn der Stream kein Seeking unterstützt, aber die Daten im Stream nicht so groß sind, können Sie den Stream in MemoryStream lesen und schreiben und so oft wie Sie wollen aus MemoryStream lesen.

0voto

TheVillageIdiot Punkte 38840

Quack und Dirty: Dieses Programm funktioniert mit einigen kleinen Pannen. Versuchen Sie es zu verbessern, denn ich verlasse das Büro :)

        ProcessStartInfo psi = new ProcessStartInfo(@"c:\temp\testC.exe");
        psi.CreateNoWindow = true;
        psi.RedirectStandardError = true;
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;

        Process p = Process.Start(psi);
        string input = "";

        ConsoleColor fc = Console.ForegroundColor;

        StreamWriter sw = p.StandardInput;
        StreamReader sr = p.StandardOutput;

        char[] buffer = new char[1024];
        int l = 0;

        do
        {
            Console.Write("Enter input: ");
            input = Console.ReadLine();

            int i = Convert.ToInt32(input);

            sw.Write(i);
            sw.Write(sw.NewLine);

            Console.ForegroundColor = ConsoleColor.Yellow;

            Console.Write(">> ");

            l = sr.Read(buffer, 0, buffer.Length);

            for (int n = 0; n < l; n++)
                Console.Write(buffer[n] + " ");

            Console.WriteLine();

            Console.ForegroundColor = fc;
        } while (input != "10");

        Console.WriteLine("Excution Finished. Press Enter to close.");
        Console.ReadLine();
        p.Close();

PS:- Ich habe die Konsolen-Exe in vs2008 erstellt und nach c kopiert: \temp Ordner mit dem Namen testC.exe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X