Announcement

Collapse
No announcement yet.

Steuerzeichen aus Datei lesen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Steuerzeichen aus Datei lesen?

    Hallo miteinander,

    unter C# möchte ich Steuerzeichen (wie z.B. \r\n) aus einer Datei lesen.
    Hintergrund ist, dass Sprachressourcen in einer einfachen Textdatei hinterlegt werden sollen und gelegentlich benötigt man dabei ja auch Zeilenumbrüche.

    Gibt es eine Funktion/Klasse, die das genau so umsetzt, wie das mit einem direkt in der IDE eingegebenen String geschieht?

    Vielen Dank im Voraus
    Gruß Knut

  • #2
    Hallo,

    Hintergrund ist, dass Sprachressourcen in einer einfachen Textdatei hinterlegt werden sollen
    Das ginge einfacher mit dem Resourcen-Manager. Siehe auch http://openbook.galileocomputing.de/...964219cdb308a1

    Ansonsten kann File, StreamWriter, StreamReader mit den Steuerzeichen schon umgehen. Ein \n genügt - \r\n ist nicht unbedingt notwendig. Die TextWriter (Basisklasse des StreamWriter) bietet auch eine Eigenschaft NewLine.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo gfoidl,

      danke für die schnelle Antwort. Werde mir das mit dem Ressourcen-Manager mal ansehen, ob es ein Lösungsansatz für meine Belange ist.

      Etwas später (nach dem Ansehen):
      Das löst das Problem nicht.
      Der Benutzer soll die Sprach-Dateien selbst ändern können, d.h. kompilierte Ressourcen kommen also nicht in Frage.

      Wenn ich in einer Textdatei 'erste Zeile\nzweite Zeile' stehen habe und diese einlese, dann wird eben
      Code:
      erste Zeile\nzweite Zeile
      dargestellt und nicht
      Code:
      erste Zeile
      zweite Zeile
      Vielleicht habe ich mich am Anfang nicht klar genug ausgedrückt.

      Gruß Knut
      Zuletzt editiert von Knut Lohse; 21.06.2010, 14:48.

      Comment


      • #4
        Code:
        erste Zeile\nzweite Zeile
        Wo zeigst Du das denn an? Nur "\n" reicht manchen Controls nicht um einen Zeilenumbruch zu machen. Die brauchen "\r\n". Im Web bringt Dir ein "\r\n" natürlich gar nichts. Dort musst Du "\r\n" durch "</ br>" ersetzen.

        Was und wie liest und schreibst Du in die Datei? Kurze Codeschnippsel wäre vielleicht von Vorteil.

        Comment


        • #5
          Hallo fanderlf,

          es scheint schwierig zu sein, mein Anliegen klar zu machen...

          Geschrieben werden die Textdateien mit einem beliebigen Texteditor oder vom Programm, jedoch ist das ohne Belang!

          Sie sollen etwa diese Form haben (ähnlich INI-Dateien):
          Code:
          [Form1]
          msg1="Alles paletti!"
          msg2="Bei der Verarbeitung ist folgender Fehler aufgetreten:\n%s"
          ...
          Bei msg2 würde dann vom Programm noch %s durch die aktuelle Fehlermeldung ersetzt, die in einer eigenen Zeile stehen soll. Ausgegeben werden die Strings auf der Form, in Meldungsboxen, auf dem Drucker... halt überall, wo einer was lesen muss/soll.

          Es soll ein Programm entstehen, das nicht von sich aus x Sprachen mitbringt (weil nicht klar ist, was gebraucht wird), sondern bei dem der Anwender selbst die Übersetzung vornehmen können soll. Vorlage wäre dann die deutsche (oder englische) Sprachdatei und der Fremdsprachler müsste dann 'nur' die entsprechenden Phrasen in seine Sprache übertragen.

          Gruß Knut

          Comment


          • #6
            Hallo,

            anstatt dem INI-Format würde ich XML verwenden. Ist mit einem entsprechenden Editor dann auch schöner zu editieren

            [highlight=c#]
            protected override void OnLoad(EventArgs e)
            {
            base.OnLoad(e);

            File.WriteAllText("test.txt", "Hallo\r\nForum ;-)");

            string text = File.ReadAllText("test.txt");
            textBox1.Text = text;
            MessageBox.Show(text);
            }
            [/highlight]
            Fuktioniert mit TextBox und MessageBox. \n geht bei der TextBox nicht jedoch bei der MBox schon.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Hallo gfoidl,

              leider Problem verfehlt: in einer INI-Datei dürfen innerhalb der Werte keine Zeielnumbrüche vorkommen, denn sie hat den Aufbau
              Code:
              [section]
              key1=value1
              key2=value2
              Die Verwendung einer weitestgehend unformatierten Textdatei (INI-Datei) ist eine Vorgabe des Auftraggebers.
              XML ist nicht so angesagt, die Anwender sind keine Programmierer und entsprechende Tools werden im Zweifelsfall nicht vorhanden sein.

              Übringens: Dateien lesen und schreiben ist nicht das Problem und ich bin kein Anfänger.

              Gruß Knut

              Comment


              • #8
                Hallo,

                immer die Infos schön langsam rausrücken

                Du könntest in der INI-Datei ein bestimmtest Zeichen zB # verwenden das als Steuerzeichen dient. Beim Einlesen der Datei wird dieses entsprechend ersetzt (also durch \r\n).

                Wäre IMHO für die Nicht-Programmierer-Anwender auch einfacher wenn sie # schreiben als \r\n


                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Hallo gfoidl,

                  Originally posted by gfoidl View Post
                  Hallo,
                  immer die Infos schön langsam rausrücken
                  Klar - soll doch spannend bleiben... Aber im Ernst: ich hatte halt gedacht, das Problem(chen) wäre auch so zu erkennen.

                  Sonderzeichen zu verwenden würde gehen, aber ich denke, es müsste doch etwas "Eingebautes" geben, das in der Lage ist, sowas umzusetzen. Ich will eben nicht selbst etwas schreiben (auch wenn's nur 10 Zeilen wären!), weil man da immer was vergessen oder falsch implementieren kann. Deshalb eben auch eher \n statt #, denn die Anwender sind Techniker (nur eben keine Programmierer), die sowas schon kennen.

                  Nochmals vielen Dank für Deine Mühe und Geduld (mit den dröppelnden Informationen).

                  Gruß Knut

                  Comment


                  • #10
                    es müsste doch etwas "Eingebautes" geben,
                    Das ist ein spezielles Problem des INI-Formats. Und Ini-dateien werden ja von Haus aus nicht mal mehr von .NET unterstützt. Insofern frage ich mich wenn du den Lese Algorithmus für die INI-Datei selber schreiben musst wieso ist der nicht so geschrieben das der einfach mit Zeilenumbrüchen umgehen?

                    Comment


                    • #11
                      Hallo gfoidl,

                      da scheint's wohl keine "schöne" Lösung zu geben. Müssen wir halt "basteln"...

                      Jedenfalls vielen dank für's Mitgrübeln.

                      Gruß Knut

                      Comment


                      • #12
                        Hallo Knut,
                        ich glaube ich habe Dein Problem richtig verstanden - ich habe bisher immer eine eigene Umsetzung der Escape-Sequenzen verwendet, wäre aber an einer eleganteren Lösung sehr interessiert.
                        (Siehe http://de.wikipedia.org/wiki/Sprache...en.E2.80.9C.29)

                        Nahezu jeder Compiler beherrscht die Interpretation von Escape-Sequenzen von Hause aus. Will ich in meinem String einen Zeilenumbruch unterbingen, so weise ich ihm einfach die Escape-Sequenz "\r\n" zu (4 Zeichen). Im Code werden daraus 2 Zeichen (0x0d, 0x0a) und bei der Ausgabe erfolgt ordnungsgemäß ein Umruch.

                        Lese ich nun EINE Zeile aus einer von Hand editierten Textdatei, z.B. "Habe\r\nHunger!", dann landet sie auch exakt so im Code des Strings, weil die Escape-Sequenzen nicht interpretiert werden. Ist ja auch richtig so. Möchte ich aber erreichen, dass daraus zwei Zeilen werden, dann muss ich den gelesenen Text so interpretieren, wie es auch mein Compiler macht. Und nun wäre es einfach nur schön, wenn ich die vom Compiler verwendete Funktion auch direkt benutzen könnte... Bisher habe ich dazu aber leider nichts gefunden.

                        Gruß Helmut

                        P.S.: Das ist sicher KEIN spezielles Problem des INI-Formats!
                        Die Zeiten, als Software nach Codezeilen bezahlt wurde, sind endgültig vorbei!

                        Comment


                        • #13
                          Hallo,

                          wenn die Escape-Zeichen als "normale" Zeichen im String stehen sind sie keine Excape-Zeichen mehr! Daher hilft nichts anderes als String.Replace, StringBuilder.Replace, Regex.Replace, ...

                          Daher würde ich für diese Fälle der Einfachheithalber auch # verwenden. Das können auch Nicht-Programmierer und Nicht-Techniker.

                          BTW: Man kann sich ja mal mit dem Reflektor die UrlEscape-Klasse anschauen und das entsprechend anpassen. AFAIK wird dort aber auch Replace durchgeführt - kompiliertes Regex wenn ich mich recht erinnere.


                          mfG Gü
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment


                          • #14
                            Originally posted by gfoidl View Post
                            wenn die Escape-Zeichen als "normale" Zeichen im String stehen sind sie keine Excape-Zeichen mehr!
                            Genau darum geht's!

                            Bisher habe ich sie immer brav umgesetzt und wieder zu Escape-Sequenzen gemacht. Das Thema ließ mich aber nicht in Ruhe und nun habe ich Regex.Unescape(string) gefunden. Klappt prima und macht genau das, was der Compiler bei einer Zuweisung macht.

                            Hoffe Knut, das war's.

                            Viel Spaß!
                            Helmut
                            Zuletzt editiert von gfoidl; 22.06.2010, 11:35. Reason: Den wichtigen Teil fett gemacht ;-)
                            Die Zeiten, als Software nach Codezeilen bezahlt wurde, sind endgültig vorbei!

                            Comment


                            • #15
                              Hallo,

                              Regex.Unescape(string)
                              Tja, so einfach kanns sein - danke für den Hinweis.

                              Echt erstaunlich was das FX alles bietet


                              mfG Gü
                              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                              Comment

                              Working...
                              X