Hallo Eilert, Am Donnerstag, 20. Juni 2002 21:07 schrieb Eilert Brinkmann:
Also mache ich noch ein "chop" hinterher, jetzt funktioniert das ganze. Aber was hängt denn da nun eigentlich für ein Steuerzeichen hinter?
Falls obige Vermutung zutrifft, läßt das chomp natürlich noch ein "\r" am Ende des Strings übrig. Mit dem zusätzlichen chop wird dieses entfernt -- aber das Funktioniert mehr "zufällig" (eben weil's das letzte Zeichen ist), ist aber keine besonders saubere und robuste Lösung.
Nach "\r" habe ich natürlich noch nicht gesucht, "\0" ist es nicht. So ganz bin ich auf java.sun.com noch nicht fündig geworden, scheinbar wird aber kein "\n" angehängt, das hab' ich Dusel selbst in Java angefügt. Das komische an der Lösung von mir ist, daß ich in Java " \n"(mit einem Leerzeichen vor!) anhänge und mit chomp & chop wieder entferne. Lasse ich " \n" weg funktioniert es trotzdem nicht korrekt. Zum testen lasse ich das erstmal so, werde morgen mal die Klassen posten, vielleicht fällt noch etwas auf.
Ist das Sprachübergreifend gleich?
Nein, nicht unbedingt. Sprachen (bzw. zugehörige Bibliotheken) stellen mitunter Hilfsmittel zum Lesen oder Schreiben von Textzeilen zur Verfügung. Die genauen Eigenschaften dieser Hilfmittel sollte man jeweils in der Dokumentation nachlesen, denn da kann es durchaus feine Unterschiede geben -- nicht nur zwischen verschiedenen Sprachen, sondern vor allem auch bei der gleichen Sprache auf unterschiedlichen Plattformen.
Ja, Windows Client, Server Linux... Da könnte auch noch etwas verschieden sein, aber die Doku zu Win9x ist ja so bescheiden :))
auch verfügbar sein. Der Programmierer wird so dabei unterstützt, die in der jeweiligen Umgebung üblichen Konventionen einzuhalten.
Jo, das muß jedenfall noch was _besser_ machen. Ist ja später für die Produktion.
festlegt. Man kann natürlich auch bewußt bestimmte Spielräume lassen und fordern, daß der Empfänger mit allen Varianten klarkommen muß.
Nee, das beibt mir zum Glück erspart...
In Deinem Fall könntest Du z.B. sagen, daß der Empfänger verschiedene Darstellungen des Zeilenendes handhaben können muß. Für die Realisierung in perl gibt `perldoc -f chomp` Hinweise, wie sich daß Verhalten von chomp beeinflussen läßt. Du könntest auch einem String in der Variable $line mit
$line =~ s/[\r\n]+$//;
von allen Carriage-Returns und Linefeeds am Ende befreien, egal, in welcher Anzahl und Reihenfolge die da stehen. Soviel ist wohl meist nicht nötig, und
$line =~ s/\r?\n$//;
reicht, um am Zeilenende ein Linefeed und -- falls vorhanden -- ein vorangestelltes Carriage-Return zu entfernen.
Ich denke, ich werde chomp & chop sein lassen und das ganze mit regex machen, so werde ich auch sehen was da nun dran hängt.
Die etwas sauberere Variante wäre es, für Deine Kommunikation genau festzulegen, wie ein ein Zeilenumbruch auszusehen hat (z.B. genau ein Linefeed), und dann in allen beteiligten Programmen sicherzustellen, daß (unabhängig von der jeweiligen Plattform) genau diese Darstellung auch verwendet wird.
Ja, das werde ich so machen, leider hatte ich nicht soviel Zeit auf der Arbeit das sauber zu machen. Zu meinem Leidwesen ist das meinem Chef egal, sein Motto: ---> Hauptsache funktioniert <--- Ich kann das jedenfalls nicht meinem Gewissen vereinbaren.
Übrigens verwenden etliche textbasierte Protokolle (z.B. auch HTTP, SMTP und NNTP) tatsächlich die Kombination von Carriage-Return und Linefeed als Zeilentrenner.
Am liebsten würde ich das binär machen, oder sogar verschlüsseln. Wegen der Sicherheit, wird meinem Chef aber zulange dauern ;(( Mal was anderes, ich habe auf meinem Linux ein Paket "libnet". Gibt es dazu ein Gegenstück für C++, oder kann ich libnet ruhig nehmen. Den Server würde ich gerne für zuhause in C++ machen :)) Dank' nochmal... CIao Andre