StreamReader und Escape-Sequenzen
-
Kann es sein, dass ein System.IO.StreamReader Escapesequenzen im Text entfernt? Wenn ja - wie kann man das verhindern?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace StringTest { class Program { static void Main(string[] args) { // Datei C:\Test.txt enthält den Text Zeile 1\nZeile 2 StreamReader sReader = new StreamReader("C:\\Test.txt"); Console.WriteLine("Zeile 1\nZeile 2"); Console.WriteLine("----------------"); Console.WriteLine(sReader.ReadLine()); } } }
Ausgabe schrieb:
Zeile 1
Zeile 2
----------------
Zeile 1\nZeile 2Ich möchte, dass der StreamReader meine Escapesequenzen beibehält.
-
Escapesequencen gibt es in Dateien nicht. Ein \n ist einfach ein \n .
Das \n wird durch den Compiler zu einem Zeilenumbruch generiert.
-
Knuddlbaer schrieb:
Escapesequencen gibt es in Dateien nicht. Ein \n ist einfach ein \n .
Das \n wird durch den Compiler zu einem Zeilenumbruch generiert.
Aber die ReadLine()-Methode des StreamReaders gibt doch einen String zurück. Wird der dann von der Methode automatisch in das Format "Zeile 1\\nZeile 2" konvertiert oder we sonst? Wie kann ich das verhindern?
-
Der StreamReader gibt exakt das aus was in Deiner Datei steht.
und wenn daZeile1\nZeile2 steht, gibt er exakt das zurück.
-
Wenn ich Console.WriteLine() einen String übergebe, überprüft die Methode doch diesen auf Escapesequenzen. Wenn also im String wirklich \n stünde, würde WriteLine() einen Zeilenumbruch ausgeben, oder nicht?
-
Nein, Escapesequenzen werden , wie gesagt, durch den Compiler umgesetzt.
-
Ich habs aber immer noch nicht verstanden. Wenn ich schreibe:
string text = "Zeile 1\nZeile 2"; Console.WriteLine(text);
dann berücksichtigt der Compiler die Escapesequenz.
Wenn die Methode WriteLine() das Gleiche in die Variable schreibt, wo ist dann der Unterschied?
-
Der Einfachheit halber beziehe ich mich hier auf ASCII und nicht auf Unicode wie es in .Net eigentlich Standard ist:
Wenn in deiner Datei steht:
Zeile1\nZeile2
Dann sind "\n" zwei Zeichen nämlich 0x5c und 0x6e diese werden in der Ausgabe als '\' und 'n' dargestellt.
Steht in deiner Datei:
Zeile1 Zeile2
So befindet sich darin ein Steuerzeichen (0x0a) das besagt, dass zwischen "Zeile1" und "Zeile2" ein neue Zeile eingefügt werden soll.
Benutzt du in deinem Code "\n" so erkennt der Compiler diese Escape-Sequenz und schreibt nicht 0x5c & 0x6e in die Ausgabedatei sondern 0x0a.
Da aber deine Eingabe aus der Textdatei nicht interpretiert wird (d.h. die Folge 0x5c 0x6e wird durch 0x0a ersetzt) erscheint sie genau so wie du sie in die Datei geschrieben hast.
Willst du zwei Zeilen in deiner Ausgabe haben musst du das auch genau so in die Datei schreiben oder es selbst ersetzen, so zum Beispiel:Console.WriteLine(sReader.ReadLine().Replace("\\n", "\n"));