Replace von "\"



  • Guten Abend zusammen,

    Ich möchte mit Hilfe von "ofstream" eine Textdatei auslesen. Dies ist auch überhaupt kein Problem:

    char zeile[80];
    int anzahl = 0;	
    String^ adresse;
    
    ifstream ReadFile("E:\\Liste.txt");
    
    while( ReadFile.getline( zeile, 80))
    {
        adresse = gcnew String(zeile);
    }
    

    So lange eine Zeile aus der Textdatei eingelesen werden kann, wird diese in den String "adresse" geschrieben. Der Sinn wird hier nicht klar, da ich einen großen Teil (da hierfür unwichtig) an Code weggelassen habe.

    Jetzt möchte ich aber nicht nur Stur aus dem Pfad "E:\Liste.txt" lesen, sondern die Datei über einen MenuStrip durch "OpenFileDialog" auswählen.
    Dies mache ich so:

    String^ Pfad;
    Pfad = openFileDialog1->InitialDirectory + openFileDialog1->SafeFileName;
    

    Mit "InititialDirectory" habe ich den Pfad und mit "SaveFileName" die Datei.

    So, jetzt kommt der - für mich - schwierigere Punkt. Da der Pfad nicht einfach "E:\Liste.txt" geschrieben werden kann (z.B.), muss ich ja "E:\\Liste.txt", also zwei Backslash (\) verwenden. Dies möchte ich über die Replace-Funktion machen.
    Bisher sieht das bei mir so aus:

    wchar_t oldText = 'D' /*68*/;
    wchar_t newText = 'E' /*69*/;
    
    pin_ptr<const wchar_t> wchr_pfad = PtrToStringChars(Pfad->Replace(oldText,newText));
    
    String^ Pfad_new;
    Pfad_new = gcnew String(wchr_pfad);
    

    Das klappt 1A. Jedes "D" wird hier durch ein "E" ersetzt. MOMENT! Ich wollte doch "\" durch "\\" ersetzen?! Genau, aber im Gegensatz zu oben genanntem Beispiel gelingt mir dies nicht.

    Kann mir jemand sagen, wie ich die Problematik mit dem Backslash lösen kann? Das Problem ist im Prinzip, dass "\" eine Escape-Sequenz innerhalb eines Strings anbricht. Demnach muss ich für einen einfachen Backslash "\\" schreiben. Wie ist es aber bei zwei Backslah. Ich habe schon hin und her probiert, bekomme es aber einfach nicht hin.

    Vielen Dank schon mal an jedem der sich die Mühe macht mir zu helfen.



  • Zwei Backslashes werden genauso gesichert:

    \\
    

    =>

    \\\\
    

    Warum willst Du das tun? Diese Sequenzen sond doch nur für den Compiler interessant wenn er Literale übersetzen soll, die Dialogbox gibt Dir doch schon den ferigen String?



  • WO wird hier WAS mit \\ geschrieben????

    Du bringst das was durcheinander! Nur *String-Lietrale* werden in C/C++ mit zwei \ geschrieben. Aber nie etwas, was von Benutzer/API kommt...



  • Jochen Kalmbach schrieb:

    WO wird hier WAS mit \\ geschrieben????

    Du bringst das was durcheinander! Nur *String-Lietrale* werden in C/C++ mit zwei \ geschrieben. Aber nie etwas, was von Benutzer/API kommt...

    Ja, dass ist mir schon klar und genau das ist ja mein Problem. Ich lese eben mit

    openFileDialog1->InitialDirectory + openFileDialog1->SafeFileName;
    

    den ausgewählten Pfad aus. Diesen Pfad schreibe ich dann in einen String und der ist eben mit einem einfachen "\" aufgebaut.
    "ofstream" erwartet aber nun mal den Typen "const char" und DANN muss ich das ganze ja mit "\\" schreiben ...

    Prinzipiell würde ich ganz gerne einfach mal wissen, wie genau ich das IN DIESEM FALL mache. Dennoch finde ich selbst meinen Weg bescheiden. Was für einen anderen Weg habe ich denn den Inhalt einer Text- oder ListBox in einer Datei zu speichern? Ich habe dies hier eben über die fstream-Klassen gemacht ...

    Über weitere Hilfe würde ich mich sehr freuen.



  • den ausgewählten Pfad aus. Diesen Pfad schreibe ich dann in einen String und der ist eben mit einem einfachen "\" aufgebaut.
    "ofstream" erwartet aber nun mal den Typen "const char" und DANN muss ich das ganze ja mit "\" schreiben ...

    Bitte mal im Grundlagenbuch C++ oder C nachlesen. Wenn Du es dann immer noch nicht siehst, noch mal nachlesen. Fehlt das wissen dann immer noch, das ganze in einem neuen Buch versuchen.

    Und btw.: C++/CLI und C++ nicht mischen.



  • FrEEzE2046 schrieb:

    "ofstream" erwartet aber nun mal den Typen "const char" und DANN muss ich das ganze ja mit "\\" schreiben ...

    WO steht das?



  • Jochen Kalmbach schrieb:

    FrEEzE2046 schrieb:

    "ofstream" erwartet aber nun mal den Typen "const char" und DANN muss ich das ganze ja mit "\\" schreiben ...

    WO steht das?

    Eventuell verstehe ich es wirklich falsch, aber bei mir sieht das so aus:

    ofstream test(const char* _Filename, std::ios_base::openmode _Mode = ios_base::out, int_Prot = (int)ios_base::_Openprot)
    

    Dort steht das ...

    Knuddlbaer schrieb:

    Bitte mal im Grundlagenbuch C++ oder C nachlesen. Wenn Du es dann immer noch nicht siehst, noch mal nachlesen. Fehlt das wissen dann immer noch, das ganze in einem neuen Buch versuchen.

    Ich weiß schon was du meinst. Wenn aber nunmal ofstream als Filename den Typ const char* erwartet, dann bleibt mir doch nicht anderes übrig, als "\\" zu schreiben.
    Wenn du es besser weisst, dann lasse ich mich gerne belehren. Ich kenne es aber nur so und da nützt es mir auch nichts in einem Grundlagenbuch nachzulesen. Eventuell verstehen wir uns auch falsch.



  • Ich weiß schon was du meinst. Wenn aber nunmal ofstream als Filename den Typ const char* erwartet, dann bleibt mir doch nicht anderes übrig, als "\" zu schreiben.
    Wenn du es besser weisst, dann lasse ich mich gerne belehren. Ich kenne es aber nur so und da nützt es mir auch nichts in einem Grundlagenbuch nachzulesen. Eventuell verstehen wir uns auch falsch.

    Unwissenheit und Sturheit führen selten zum ziel. Du solltest wirklich mal in ein Grundlagenbuch rein schauen. Du würdest dann z.B. feststellen, das die Escapesequenzen (siehe Wikipedia) bei der Eingabe direkt im Quellcode verwendet werden.

    Selbst wenn man zu faul zum lesen ist, kann manchmal einfaches ausprobieren weiterhelfen. Dann könnte man sich eine Eingabe aus der Textbox z.B. mal im Debugger ansehen.

    Dir haben jetzt 3 Leute das gleiche gesagt und es interessiert Dich nicht. Bliebe dann die Frage: Was willst Du ?!



  • FrEEzE2046 schrieb:

    Wenn aber nunmal ofstream als Filename den Typ const char* erwartet, dann bleibt mir doch nicht anderes übrig, als "\\" zu schreiben.

    WAS hat denn "const char" mit "\\ "zu tun???
    "const char" heisst nur, dass die Funktion den String nicht verändert...



  • Leute, macht den armen Kerl doch nicht so fertig! Er wird's schon noch begreifen...

    Wenn du einen Pfad in einem String über eine Funktion bekommst ("C:\test"), dann steht da ein Backslash drin. Wenn du selbst einen Pfad in deinem Code notierst (du schreibst dann "C:\\test"), dann steht da ebenfalls ein Backslash drin. Alles klar? Lies dir einfach was über Escapesequenzen durch, sobald du das verstanden hast, sollte die Sache spätestens klar sein. Konkret heißt das für dich, dass du da nix ersetzen musst. Nimm den String einfach so, wie du ihn kriegst. Der "einfache Backslash" ist schon in Ordnung. 😉



  • Somit haben es ihm nun 4 Leute gesagt - ob es jetzt verständlicher ist ? 😉



  • _matze schrieb:

    Wenn du einen Pfad in einem String über eine Funktion bekommst ("C:\test"), dann steht da ein Backslash drin. Wenn du selbst einen Pfad in deinem Code notierst (du schreibst dann "C:\\test"), dann steht da ebenfalls ein Backslash drin. Alles klar? Lies dir einfach was über Escapesequenzen durch, sobald du das verstanden hast, sollte die Sache spätestens klar sein. Konkret heißt das für dich, dass du da nix ersetzen musst. Nimm den String einfach so, wie du ihn kriegst. Der "einfache Backslash" ist schon in Ordnung. 😉

    Bitte alle mal beruhigen. Es gibt keinen Grund zur Aufregung. Jetzt habe ich endgültig begriffen, dass WIR ANEINANDER VORBEIREDEN. Alles was IHR SAGT ist zu 100% RICHTIG. Was ihr aber noch nicht verstanden habt, ist, dass ich das auch gar nicht anzweifeln will / wollte.

    1. Mir ist durchaus klar, dass ein "\\" trotzdem nur ein "\" ist. Das Problem was ich habe - und was euch offensichtlich so verwirrt - ist, dass ich den Pfad (so wie er ganz normal von Windows vorgegeben wird) in einen String schreibe.
    2. Da ich dann den Pfad aus dem String auslese, um ofstream zu verwenden, muss ich wieder "\\" schreiben, damit der Compiler weiß, dass es sich hier um einen einfachen Backslash und keine andere Escape-Sequenz handelt.

    Ich bin wirklich der letzte der hier nerven möchte, aber ich habe mich mit dem Thema schon lange genug beschäftigt und herum experimentiert, bevor ich hier geschrieben habe.
    Ich finde es traurig, dass man hier dafür gleich angemault wird, obwohl zumindest für mich jetzt klar ist, dass es sich sogar nur um ein Missverständnis gehandelt hat.

    Irgendwie scheine ich zu blöd zu sein, mich richtig auszudrücken. Für jeden der jetzt hier noch was posten möchte um mir zu helfen:
    Alles was meine Vorredner gesagt haben, ist mir zu 100% klar. Ich "kapiere" das schon und weiß es auch. Problem ist lediglich, dass ich den Pfad zunächst in einen String schreibe.

    String^ Pfad;
    Pfad = openFileDialog1->InitialDirectory + openFileDialog1->SafeFileName;
    

    und daraus dann wieder für ofstream lese.



  • 1. ofstream (native C++) und System::String (C++/CLI) nicht einfach mischen.
    2. liefere mal die konkrete Fehlermeldung Deines Compilers. Ich glaube, Du hast das nicht ein einziges mal Probiert.

    Schau Die System::IO:File an -> ofstream
    Schau Dir System::IO::Path::Combine an => ( pfad + dateiname)

    System::String^ => char*:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-158664.html



  • WO _schreibst_ Du einen Pfad in einen String?
    Zeig doch mal ein (vollständiges) Beispiel, was nicht geht...



  • Knuddlbaer schrieb:

    1. ofstream (native C++) und System::String (C++/CLI) nicht einfach mischen.
    2. liefere mal die konkrete Fehlermeldung Deines Compilers. Ich glaube, Du hast das nicht ein einziges mal Probiert.

    Ich habe es lange, lange, lange probiert. Deine Unterstellung ist falsch - ob du das nun glaubst oder nicht. 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?

    Ich möchte mit Replace ein einfaches "\" durch ein "\\" ersetzen. Mein Code dazu sieht so aus:

    String^ Pfad;
    Pfad = openFileDialog1->InitialDirectory + openFileDialog1->SafeFileName;
    

    //Hiermit lese ich meinen ausgewählten Pfad aus und schreibe ihn in einen String! Daher auch die Problematik mit der Escape-Sequenz die später folgt.

    wchar_t oldText = 92 /* "\" */;
    wchar_t newText = 92+92 /* "\\" */;
    

    //Hiermit deklarie ich das zu ersetzende Zeichen (oldText) und das einzusetzende
    Zeichen (newText). Das letzteres nicht so funktionieren kann wie ich es will, ist mir klar (da 92+92 = 184 und damit die Zahl "9" (184-127 = 57)).

    pin_ptr<const wchar_t> wchr_pfad = PtrToStringChars(Pfad->Replace(oldText,newText));
    

    //Hier möchte ich Replace nun also durchführen.

    String^ Pfad_new;
    Pfad_new = gcnew String(wchr_pfad);
    

    //Letztendlich wird hiermit der "neue Pfad" in einen neuen String geschrieben

    Anschließend benutze ich Pfad_new für meinen ofstream.

    Jetzt gibt es zwei Lösungsmöglichkeiten:
    1. Entweder ihr könnt mir sagen, wie ich das ganze anders lösen kann
    2. Ihr könnt mir sagen, wie ich zwei "\\" in "newText" deklarieren kann.

    Ich hoffe das Ganze ist jetzt etwas klarer geworden. Ich bitte euch aber vor einem weiteren Post euer Temperament etwas zurück zu fahren. Ich habe mich wirklich lange genug vorher mit meinem Problem auseinander gesetzt bevor ich hier gepostet habe, dass könnt ihr mir ruhig mal glauben.
    Das ich hier evtl. einen Fehler gemacht habe, kann mir dann auch auf nettere weiße gesagt werden. Wäre an dem oben genannten Code alles richtig, würde er schließlich auch funktionieren.

    Dazu gesagt sei nochmals, dass mein Compiler logischerweise keinen Fehler ausgibt, sondern mir lediglich jedes Backslash durch eine 9 ersetzt (Begründung oben ...).



  • 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 "\"...



  • 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


Anmelden zum Antworten