Laden...

StreamReader und "\r" ?!

Erstellt von Rush vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.441 Views
R
Rush Themenstarter:in
3 Beiträge seit 2013
vor 10 Jahren
StreamReader und "\r" ?!

Hallo Leute, ich bin neu hier und hoffe dass ich mit meinem Anliegen hier richtig bin.

Ich habe einen kleinen TCP Client geschrieben. Dieser holt die Daten über die ReadLine-Methode des Streamreaders ab. Hier der codeschnipsel:


private void ReceiveMessages()
            {
                srReceiver = new StreamReader(tcpServer.GetStream());

                while (Connected)
                {
                    try
                    {
                        
                        this.Invoke(new UpdateLogCallback(this.UpdateLog), new object[] { srReceiver.ReadLine() });
                       
                    }catch(IOException io)
                    {
                        MessageBox.Show(io.ToString());
                    }
                }
            }

 private void UpdateLog(string strMessage)
            {
                switch (strMessage)
                {
                    case "ean": txtLog.Text += "Scan ean code\r\n"; break;
                    case "0": txtLog.Text += "Nothing to do\r\n"; break;
                }
            }


Das Ganze funktioniert auch so wie es sollte, jedoch nur wenn der Streamreader am Ende ein "\r\n" vorfindet. Mein Stringtermininierungszeichen ist allerdings ein "\r". Das Terminierungszeichen seitens des Servers kann ich nicht ändern.
Bei dem Streamwriter gibt es ja die NewLine-Eigenschaft, diese scheint es beim dem Reader leider nicth zu geben.
Hat eventuell jemand eine ganz simple Lösung für mein Problem ?

Hatte schonmal gegoogelt. Viele meinten man solle einfach dei ReadToEnd-Methode nehmen und dann den String quasi manuell untersuchen. Die ReadToEnd-Methode liefert bei mir allerdings garnichts. Erst wenn ich den Socket schließe liefert die Methode das was ich gesendet habe ?!

Gut, hoffe ihr könnt mir helfen.
Danke schonmal im Voraus.

1.820 Beiträge seit 2005
vor 10 Jahren

Hallo,

dann wird dir wahrscheinlich nichts anderes übrig bleiben, als die Zeilen komplett selbst einzulesen, d.h. Byte für Byte lesen, bis das von dir erwartete Zeichen kommt.

Nobody is perfect. I'm sad, i'm not nobody 🙁

R
Rush Themenstarter:in
3 Beiträge seit 2013
vor 10 Jahren

genau dem wollte ich entgehen 😦

W
872 Beiträge seit 2005
vor 10 Jahren

A line is defined as a sequence of characters followed by a line feed ("\n"), a carriage return ("\r"), or a carriage return immediately followed by a line feed ("\r\n"). The string that is returned does not contain the terminating carriage return or line feed. The returned value is Nothing if the end of the input stream is reached.

Das Zitat stammt aus der Doku vom StreamReader - ergo liegt der Fehler vielleicht woanders, als beim ReadLine.

R
Rush Themenstarter:in
3 Beiträge seit 2013
vor 10 Jahren

Die Zeilen hatte ich auch schon entdeckt. Deswegen wundert es mich umso mehr dass es nicht auf Anhieb funktioniert. Immerhin sollte es das laut Doku.

1.552 Beiträge seit 2010
vor 10 Jahren

Hallo Rush,

hab das Beispiel der Doku etwas umgeschrieben, um zu testen ob es sicher funktioniert, und das tut es:


[Test]
public static void Main()
{
    string path = Path.GetTempFileName();
    try
    {
        using (StreamWriter sw = new StreamWriter(path))
        {
            sw.Write("This\r");
            sw.Write("is some text\n");
            sw.Write("to test\r\n");
        }

        using (StreamReader sr = new StreamReader(path))
        {
            int i = 0;
            while (sr.Peek() >= 0)
            {
                Console.WriteLine("Line {0} : {1}",++i, sr.ReadLine());
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The process failed: {0}", e.ToString());
    }
    File.Delete(path);
}

Gruß,
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp