char* in wchar_t konvertieren?



  • also, ich hab eine txt datei, in der der user einen dateipfad angeben kann,der dateipfad ist also im normalen ascii format. nun möchte ich die datei auslesen, und gleichzeitig ins unicode(also wchar_t) format konvertieren, wie kann ich das machen?



  • otze schrieb:

    also, ich hab eine txt datei, in der der user einen dateipfad angeben kann,der dateipfad ist also im normalen ascii format. nun möchte ich die datei auslesen, und gleichzeitig ins unicode(also wchar_t) format konvertieren, wie kann ich das machen?

    Z.B. unsere FAQ lesen:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39492



  • naargh einmal nich gesucht und direkt ins fettnäpfchen-.-
    najut, danke^^



  • @otze
    Einfacher sind natürlich die Funktionen mbstowcs bzw. wcstombs



  • k, ma schaun was ich nehme...

    aber eine frage hab ich, ich hab wzar schon in die hilfe geschaut, aber trotzdem verstehe ichs nicht: was genau ist der sinn von use_facet im ersten link? würde nicht widen alleine genügen?



  • otze schrieb:

    aber eine frage hab ich, ich hab wzar schon in die hilfe geschaut, aber trotzdem verstehe ichs nicht: was genau ist der sinn von use_facet im ersten link? würde nicht widen alleine genügen?

    Was meinst du mit "widen alleine"?
    Für einzelne Zeichen könntest du natürlich die widen-Methode aus basic_ios verwenden. Die verwendet das ctype-Facet des Char-Typs mit dem basic_ios instanziiert wurde.

    Von char nach wchar_t kannst du also auch so kommen:

    wchar_t wc = wcout.widen('c');
    

    So kannst du aber nur einzelne Zeichen umwandeln. An die Stringvariante kommst du nur direkt über das ctype-Facet.



  • *noch eine dumme frage stell*
    könnte man dann nich szatt use_facet transform verwenden?

    struct widen{
        void operator()(char a,wchar_t b){
             b=wcout.widen(a);
        }
    };
    
    //in der main
    char a[6]="hallo";
    wchar_t b[6];
    transform(a,a+5,b,widen);
    

    im gegensatz zu use_facet wüsste ich da wenigstens, was ich mache 🙄



  • otze schrieb:

    *noch eine dumme frage stell*
    könnte man dann nich szatt use_facet transform verwenden?

    struct widen{
        void operator()(char a,wchar_t b){
             b=wcout.widen(a);
        }
    };
    
    //in der main
    char a[6]="hallo";
    wchar_t b[6];
    transform(a,a+5,b,widen);
    

    Könnte man, wäre aber unnötig ineffizient. Nicht nur das du dir für jedes Zeichen das entsprechende facet holst (teuer), die Umwandlung des Zeichens passiert dann auch noch in einer virtuellen Funktion.

    im gegensatz zu use_facet wüsste ich da wenigstens, was ich mache

    Deshalb würde ich im Zweifelsfall einfach die genannten Funktionen verwenden. Alternativ gehst du einfach mal drei Wochen in Klausur und liest "Standard C++ IOStreams and Locales" von Langer und Kreft.
    Danach weißt du auch ganz genau, was use_facet macht.
    Einen groben Überblick verschafft auch Josuttis' "The C++ Standard Library".



  • "The C++ Standard Library" lohnt sich das buch überhaupt noch, wenn man mit dem großteil der stl vertraut ist(bzw mit den sachen die bei sgi stehen)?
    ich meine, wegen vielleicht 1-2 kapiteln kauf ich mir kein teures buch, mein geldbeutel ist atm eh irgendwie...leer^^

    //edit ok, nach nem marathon durch die hilfe hab ichs eingesehen: ich brauch das buch^^ irgendwie is da ziemlich viel noch in der stl drin, was bei sgi nicht angeschnitten wird 🙄.

    was ich bisher verstanden hab:
    ctype ist ein objekt, das sich selber zerstört, sobald es keine rferenzen mehr drauf gibt(glaub ich^^).ctype enthält desweiteren dann methoden um typen zu strings zu konvertieren. use_facet sorgt einfach dafür, dass ctype erst zerstört wird, wenn es keine referenzen mehr drauf gibt(glaub ich :D).


Anmelden zum Antworten