wstring in string umwandeln



  • Hallo,

    ich suche mit WinApi-Funktionen Dateien nach bestimmten Dateiendungen aus einem Ordner heraus. Diese Dateinamen werden als wchar_t gespeichert. Dann schiebe ich sie in einen Stringstream, um sie per sstream.str() an eine Funktion LoadFromFile(const std::string & Filename) zu übergeben. Kompiliere ich als Multibyte, klappt das gut bisher.

    Nun wollte ich das Ganze auch mal als Unicode Version kompilieren.
    Dazu habe ich einen wstringstream benutzt:

    std::wstringstream stream(L"");
    stream << L"Grafiken/" << ffd.cFileName;
    LoadFromFile(stream.str())
    

    Daraufhin spuckt er mir folgenden Fehler raus:

    error C2664: LoadFromFile': Konvertierung des Parameters 1 von 'std::basic_string<_Elem,_Traits,_Ax>' in 'const std::string &' nicht möglich
    

    Ich habe schon so manches, höchstwahrscheinlich naives, ausprobiert...

    std::vector<char> charvec;
    std::string s;
    const size_t wlen = stream.str().length();
    
    for(size_t i = 0; i < wlen; i++)
    {
      charvec.push_back(stream.str().at(i));
      s += charvec[i];
    }
    LoadFromFile(s)
    

    Das hier liefert mir den String, wenn ich ihn mit std::cout ausgeben. Das Programm läuft auch an, allerdings stürzt es an der Stelle mit LoadFromFile(s) ab. Irgendwas passt also nicht.

    Was kann ich tun? Gibt es eine Lösung für mich?

    Danke schon einmal im Voraus!



  • Wenn du mittels eines wstringstreams einliest solltest du auch in einem wstring speichern. Das Umwandeln kann man so machen, wie in diesm FAQ-Artikel beschrieben.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39492.html



  • Oder man schreibt sich Funktionen dafür:

    // converts a wstring to a string
    std::string narrow(const std::wstring& wcs)
    {
        std::vector<char> mbs(wcs.length());
        std::wcstombs(&mbs[0], wcs.c_str(), wcs.length());
        return std::string(mbs.begin(), mbs.end());
    }
    
    // converts a string to a wstring
    std::wstring widen(const std::string& mbs)
    {
        std::vector<wchar_t> wcs(mbs.length());
        std::mbstowcs(&wcs[0], mbs.c_str(), mbs.length());
        return std::wstring(wcs.begin(), wcs.end());
    }
    


  • Nicht oder, sondern und
    Nicht das das hier stören würde, aber sind wcstombs und co. nicht eigentlich zur Umwandlung von UTF8-strings nach wstring gedacht?



  • Braunstein schrieb:

    Nicht oder, sondern und
    Nicht das das hier stören würde, aber sind wcstombs und co. nicht eigentlich zur Umwandlung von UTF8-strings nach wstring gedacht?

    Keine Ahnung, ich hab halt mal Umwandlungsfunktionen gebraucht und mit den Infos die ich im Internet gefunden habe die beiden Funktionen geschrieben und es hat funktioniert (bzw. schien zu funktionieren, wer weiß...)



  • Habt Dank, es scheint für den Moment zu funktionieren... man, das hat aber auch genervt.. übrigens habe ich es jetzt mit den "Namenlosen" Funktionen gemacht, falls es wen interessiert. Die Posts aus der Faq zB verstehe ich teilweise gar nicht und hoffe mal, die Funktionen haben keine Fehler... 🙂

    Danke nochmal!


Anmelden zum Antworten