Backslash in Slash umwandeln



  • Hallo
    kann mir jemand sagen wie man in C++ in Pfadangaben das Backslash in ein Slash umwandelt, um die Pfadangabe in SQL zu schreiben?
    MfG
    Crazy 😃



  • man testet, ob das Zeichen gleich '\' ist, und wenn ja, ersetzt man es durch '/'. Wenn du genaueres wissen willst musst du selbst genauer werden.



  • Wie genauer?
    Ich möchte, wenn ich zb. eine Datei inkl. des absoluten Pfads einlese (Z.B C:\Programme\Beispiel\Beispiel.txt) und diese dann in eine mySQL Tabelle schreiben möchte, habe ich bzw mySQL das Problem, das die Backslashes nicht erkannt werden und die Pfadangabe dann in mySQL dann so Aussieht:
    C:ProgrammeBeispielBeispiel.txt.
    Um aber eine Pfadangabe mit Slashes(C:/Programme/Beispiel/Beispiel.txt)in mySQL zu erhalten müssen die Backslashes in forward slashes umgewandelt werden.
    So ich hoffe das war jetzt genau genug 😃 und mir kann jemand erzählen, wie ich das bewerkstellige bzw. wie ich die Slashes auslese und umwandle.
    MfG
    Crazy 😃



  • #include <string>
    
    void turnSlashes(std::string& str) {
      for (std::string::iterator i = str.begin; i != str.end(); ++i)
        if (*i == '\\')
          *i == '/';
    }
    

    Wenn dir die Lösung nicht gefällt, weißt du was ich mit "genauer" meinte. Wenn doch, hattest du Glück.

    PS: Wahrscheinlich gibts irgendeinen l33ten STL-Algorithmus dafür.



  • Hehe wir wärs mit dem 😃

    void Replace(std::string& s)
    {
      struct IsBackSlash {
        bool operator()(char c)
        {
          if(c == '\\') return true;
          return false;
        }
      };
      replace_if(s.begin(), s.end(), IsBackSlash(), '/');
    }
    

    [ Dieser Beitrag wurde am 10.04.2003 um 21:53 Uhr von Lars editiert. ]



  • Genau. Wiederverwendung über alles!



  • Eben. Hier die verbesserte Version 😃 😉

    template<char cc>
    struct compare_char{
      bool operator()(char c)
      {
        if(c == cc) return true;
        return false;
      }
    };
    void replace(std::string& s)
    {
    
      replace_if(s.begin(), s.end(), compare_char<'\\'>(), '/');
    }
    


  • Original erstellt von Lars:
    **```cpp
    void Replace(std::string& s)
    {
    struct IsBackSlash {
    bool operator()(char c)
    {
    if(c == '\') return true;
    return false;
    }
    };
    replace_if(s.begin(), s.end(), IsBackSlash(), '/');
    }

    mit lokalen structs kann man das nicht weil, templates nur mit externen typen instanziert werden können



  • Original erstellt von Lars:
    **Eben. Hier die verbesserte Version 😃 😉

    template<char cc>
    struct compare_char{
      bool operator()(char c)
      {
        if(c == cc) return true;
        return false;
      }
    };
    void replace(std::string& s)
    {
    
      replace_if(s.begin(), s.end(), compare_char<'\\'>(), '/');
    }
    ```**
    

    schwach :p

    replace_if(s.begin(), s.end(), bind1st( equal_to<char>(), '\\'), '/');
    

    und das zeigt das man bool noch nicht kapiert hat

    if(c == cc) return true;
        return false;
    
    //ein
        return c == cc; // finde ich besser
    


  • Hallo,
    seit ihr alle irre, oder bin ich doof?

    Warum nicht einfach:

    replace(s.begin(), s.end(), '\\', '/');
    

    ?

    Oder ist es jetzt cool völlig blödsinnigen Code zu schreiben oder die Algorithmen der STL als 'l33t' (was auch immer das heißen mag) zu bezeichen?

    Falls der Fehler mal wieder bei mir liegt, bitte ich ihn zu entschuldigen.

    Falls ich ausnahmsweise mal nicht falsch liegen sollte, rate ich dem einen oder anderen hier mal ein Buch über den effektiven Einsatz der STL zu studieren.

    [ Dieser Beitrag wurde am 11.04.2003 um 00:06 Uhr von HumeSikkins editiert. ]



  • 😃
    toll, Hume 😃
    da muss man einfach lachen 😃



  • *lol*

    [läster]Naja, das Stichwort heißt Iteration, Lars kam immerhin bis zum replace_if() an replace() heran, mit ein paar Posts mehr wäre das schon noch was geworden! ;)[/läster]



  • Bashar ist schuld er hat mich aufgestachelt 😃

    was ich noch erwähnen will, also so habe ich das zumindestenz in php mitbekommen wenn man ein \ in die db eintragen will muss man \\\ benutzen, einmal für php (bzw. c++) der daraus \\ macht und dann kommt ja noch der sql interpreter der macht dann aus den \\ ein \



  • in PHP kann man aber auch einfach alles in Singlequotes reintun.
    naja, ein / ist IMHO trotzdem besser, als vier \ 😃
    (besser = in dem Fall kürzer)



  • Original erstellt von Dimah:
    **Bashar ist schuld er hat mich aufgestachelt 😃

    was ich noch erwähnen will, also so habe ich das zumindestenz in php mitbekommen wenn man ein \ in die db eintragen will muss man \\\ benutzen, einmal für php (bzw. c++) der daraus \\ macht und dann kommt ja noch der sql interpreter der macht dann aus den \\ ein **

    stichwort:
    magic_quotes
    und du bist die probleme los



  • Original erstellt von Dimah:
    **und das zeigt das man bool noch nicht kapiert hat
    **

    das seh ich sonst nur bei anderen 😮



  • Shade: ist magic_quotes nicht eine Server-Option? Dadurch dass man sich effektik auf beide Situationen einstellen muß hat man doch eher mehr Probleme als vorher.



  • Original erstellt von Bashar:
    Shade: ist magic_quotes nicht eine Server-Option? Dadurch dass man sich effektik auf beide Situationen einstellen muß hat man doch eher mehr Probleme als vorher.

    du musst dich nicht auf beide situationen einstellen - du kannst die magic quotes auch zur runtime ein- und ausschalten.

    also bei uns haben wir die versuche ohne magic quotes wieder abgewöhnt - zuviele fehlerquellen.
    es ist einfach besser, wenn die datenbank selber die quotes setzt (schließlich weiß sie es ja besser)

    und ein
    (achtung, PHP)
    str=mysql_real_escape(str=mysql\_real\_escape(str); //oder so ähnlich, weiß jetzt leider nicht wie die funktion genau heißt
    mysql_query(str);istschwererzulesenalseinmysqlquery(str); ist schwerer zu lesen als ein mysql_query(str);

    detto in C++ - wozu soll ich riskieren, dass ich einmal diese 'escape' funktion vergesse, wenn die DB es automatisch für mich machen kann?


Anmelden zum Antworten