Replace von "\"



  • Jochen Kalmbach schrieb:

    Bevor ich auf das "wchar_t newText = 92+92 /* "\" */;" eingehe:

    Erklär uns bitte nochmals: WARUM willst Du es ersetzen?
    Glaube mir: Es gibt _keinen_ Grund... es sei denn Du schreibst ein "String-Literal" im Source-Code mit dem "\"...

    Erstmal Danke für die vernünftige Fragestellung!
    Das hat folgenden Grund:

    Wenn ich den Pfad "direkt" in ofstream verwende, sagt mir der Compiler (anhand des Beispieles "E:\Liste.txt"):

    warning C4129: 'L' : unrecognized character escape sequence
    

    Deswegen denke ich mir, dass "\" eine Escapesequenz einleutet und "L" gibt es ja schließlich nicht. DESWEGEN möchte ich "\" durch "\\" ersetzen ...



  • Also, wir fassen nochmals zusammen:
    1. Du gibst den String im Source-Code ein.
    2. Der Benutzer gibt keine Strings in den Source-Code ein.

    aus 1 folgt: Ja, im Source-Code musst Du bei String-Literalen das \ durch zwei \\ ersetzen. Das macht man aber nicht durch irgendwelche "Ersetzungsfunktionen", sondern indem man einfach zwei \\ in den Quellcode reinschreibt

    aus 2 folgt: Auch wenn der Benutzer ein \ eingeben würde, so gibt es keinen Grund daraus zwei zu machen

    da aus 1 auch folgt: Der *Compiler* macht aus zwei \\ wieder _ein_ \! Aus diesem Grunde sieht jede Funktion die Du mit einen String aufrufst immer nur *******EIN****** \

    c.e.d



  • Jochen Kalmbach schrieb:

    Also, wir fassen nochmals zusammen:
    1. Du gibst den String im Source-Code ein.
    2. Der Benutzer gibt keine Strings in den Source-Code ein.

    aus 1 folgt: Ja, im Source-Code musst Du bei String-Literalen das \ durch zwei \\ ersetzen. Das macht man aber nicht durch irgendwelche "Ersetzungsfunktionen", sondern indem man einfach zwei \\ in den Quellcode reinschreibt

    aus 2 folgt: Auch wenn der Benutzer ein \ eingeben würde, so gibt es keinen Grund daraus zwei zu machen

    da aus 1 auch folgt: Der *Compiler* macht aus zwei \\ wieder _ein_ \! Aus diesem Grunde sieht jede Funktion die Du mit einen String aufrufst immer nur *******EIN****** \

    c.e.d

    Dem kann ich nicht widersprechen und das wollte ich auch nie. Mir ist obiges durchaus im klaren.
    Meine Frage ist doch auch viel meher, wie ich den normalen Pfad mit einem "\" in ofstream verwenden kann ... denn wie gesagt: Er gibt immer die Meldung heraus, dass "L" (bei dem von mir genanten Beispiel) keine bekannte Escape-Sequenz sei ...



  • Ich wiederhole mich zum letzten Mal:
    Schreibst Du im *Source* ein _String-Literal_, dann musst Du *zwei* \ machen. In allen anderen Fälle nur ein \.

    http://en.wikipedia.org/wiki/String_literal



  • Jochen Kalmbach schrieb:

    Ich wiederhole mich zum letzten Mal:
    Schreibst Du im *Source* ein _String-Literal_, dann musst Du *zwei* \ machen. In allen anderen Fälle nur ein \.

    http://en.wikipedia.org/wiki/String_literal

    Ja, dass weiß ich doch auch. Meine Frage ist seit Beginn des Threades warum mir der Compiler die Rückmeldung gibt, dass er die Escape-Sequenz "L" nicht kennt. NUR DESWEGEN bin ich doch überhaupt auf die Idee gekommen, das "\" durch ein "\\" zu ersetzen.
    Was nützt es mir, wenn du mir sagst, dass es so ist, wenn ich es umsetze der Compiler aber widerspricht. Entweder verstehst du nicht, was genau ich machen möchte oder wir reden aneinander vorbei ...

    Wie wäre es denn, wenn du mir einfach mal ein Beispiel aufzeigen könntest, wie ich anhand meines Beispiels ofstream verwenden könnte.



  • Abgesehen davon, dass du eine wirklich krude Mischung aus C++ und C++/CLI schreibst und man dir deshalb vielleicht besser nicht helfen sollte, redet niemand an dir vorbei.

    Man kann ofstream ohne Problem mit der Ausgabe von OpenFileDialog benutzen. Da wird nix verdoppelt und es gibt auch keine Compilerfehler.

    OpenFileDialog^ dlg = gcnew OpenFileDialog();
    
     if ( dlg->ShowDialog() == System::Windows::Forms::DialogResult::OK )
     {
       const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(dlg->FileName)).ToPointer();
       std::string os = chars;
       Marshal::FreeHGlobal(IntPtr((void*)chars));
    
       std::ofstream file(os.c_str());
    
       // hier ofstream benutzen
     }
    


  • Und da du was lesen willst, meinst du wahrscheinlich ifstream und nicht ofstream ?

    Wenn man das Gelesene hinterher eh wieder in einen .net-String umwandelt, kann man auch gleich StreamReader nehmen ...

    Aber das Ganze soll wahrscheinlich eh nur etwas machen, dass File::ReadAllLines schon fertig bietet. :xmas2:



  • nn schrieb:

    Und da du was lesen willst, meinst du wahrscheinlich ifstream und nicht ofstream ?

    Wenn man das Gelesene hinterher eh wieder in einen .net-String umwandelt, kann man auch gleich StreamReader nehmen ...

    Aber das Ganze soll wahrscheinlich eh nur etwas machen, dass File::ReadAllLines schon fertig bietet. :xmas2:

    Nein Nein, es soll schon etwas schreiben, daher ist ofstream korrekt.

    Vielen Dank, so funktioniert es auch. Bei meiner Version gab es jedoch schon einen Compiler-Fehler.



  • FrEEzE2046 schrieb:

    Das wir ein Verständigungsproblem haben zeigt allein, dass du von mir "die Fehlermeldung des Compilers" willst ... wann habe ich geschrieben, dass ich eine bekomme?

    [...]

    Vielen Dank, so funktioniert es auch. Bei meiner Version gab es jedoch schon einen Compiler-Fehler.



  • Knuddlbaer schrieb:

    FrEEzE2046 schrieb:

    Das wir ein Verständigungsproblem haben zeigt allein, dass du von mir "die Fehlermeldung des Compilers" willst ... wann habe ich geschrieben, dass ich eine bekomme?

    [...]

    Vielen Dank, so funktioniert es auch. Bei meiner Version gab es jedoch schon einen Compiler-Fehler.

    Hehe, war ja klar, dass du mir das jetzt so auslegst^^. Das bezog sich aber eher darauf, dass es einen Compiler-Fehler gab, wenn ich den String mit einem "\" geschrieben hatte, da er den darauffolgenden Buchstaben für eine Escape-Sequenz hielt ...


Anmelden zum Antworten