wchar_t speichert nicht den Text?



  • Hallo erstmal,
    Wie schon im Titel gesagt habe ich eine Frage: Was speichert wchar_t? Den Text, die Bytes des Textes, ...
    Wenn ich z.B bei dem Programm (folgender Code) "abc" in den Edit Control eingebe, enthalte ich "00F9F010" im Text-Dokument. Code:

        case WM_COMMAND:
            if (lParam == (LPARAM)hwndButton)
            {
                wchar_t  buff[1024];
                GetWindowText(hwndEdit, buff, 1024);
                ofstream put_in("Documents//passpass.txt", ios_base::out);
                put_in << buff;
                put_in.close();
            }
            break;
    

    Schonmal vielen Dank im Vorraus!





  • Du hast dir ja auch die Adresse der Variablen buff ausgeben lassen (da es keine Überladung bei ofstream für einen wchar_t* gibt).
    Also entweder einen wofstream benutzen oder eine passende Konvertierungsfunktion.

    PS: Du solltest dann auch explizit GetWindowTextW benutzen (um nicht abhängig vom Makro UNICODE zu sein).



  • @Swordfish Danke jetzt weiß ich da Bescheid.



  • @Th69 Danke erstmal für die schnelle Antwort. Hab das jetzt so gemacht:

                wchar_t  buff[1024];
                GetWindowTextW(hwndEdit, buff, 1024);
                wofstream put_in("Documents//passpass.txt", ios_base::out);
                put_in << buff;
                put_in.close();
    

    Und es gibt keinen Compiler-Fehler oder sonstiges. Nur ist jetzt das Problem das nichts in passspass.txt geschrieben wird bzw. kein Text (die Datei ist leer). Was ist da Falsch?
    Bin noch ein ziemlicher Anfänger deshalb verzeiht wenn ich zu Teilen offensichtliche Zusammenhänge nicht finde oder die einzelnen verschieden Variablen wie TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR... noch nicht so beherrsche. Trozdem wieder Danke im Vorraus!



  • Womit überprüfst du denn den Text in der Datei? Schau zuerst mal im Explorer, wie groß die Datei ist (sie sollte 2x Länge des eingegeben Textes sein).
    Falls du einen Texteditor hast, der verschiedene Zeichenkodierungen unterstützt (z.B. "Notepad++"), die von dir beschriebene Datei sollte im Format "UTF-16 No BOM" sein).
    Ansonsten müßtest du vorher noch die Byte Order Mark (BOM) setzen:

    wchar_t bom = 0xFFFE; // BOM für UFT-16 LE (0xFF 0xFE) // ich hoffe, ich habe mich hier jetzt nicht vertan, ansonsten "0xFEFF" benutzen (da Windows Little Endian verwendet)
    put_in << bom << buff; // 'put_in' sollte besser 'put_out' heißen ;-)
    

    und dann sollte es automatisch als "UTF-16 LE" erkannt werden.

    Generell ist das Thema Zeichenkodierung (bzw. englisch "character encoding") nicht gerade ein Anfängerthema - besonders das Mischen verschiedener Kodierungen.

    PS: Die WinAPI ist aber auch nicht mehr zu empfehlen, da gibt es viel besser auf C++ zugeschnittene GUI-Frameworks, s. a. Tutorial für Desktop Anwendung mit Fenstern?



  • @Th69 sagte in wchar_t speichert nicht den Text?:

    Womit überprüfst du denn den Text in der Datei?

    Hexeditor ist eigentlich ein Tool das man immer rumliegen haben sollte. Frhed ist ganz nett.



  • @Felix sagte in wchar_t speichert nicht den Text?:

    TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR

    T steht für einen beliebigen Datentyp. Hier char oder wchar_t. Hängt davon ab ob UNICODE definiert ist oder nicht.
    W steht für Wide Character, wchar_t.
    LPSTR ist ein long pointer to string, also ein char* (die Zeiten als zwischen NEAR und FAR (long) Pointern unterschieden wurde sind längst vorbei, die Nomenklatur ist historisch gewachsen)
    LPWSTR ist ein long pointer to wide string, also ein wchar_t*
    LPCTSTR ist ein long pointer to constant T string wobei T für char oder wchar_t steht. Also ein char const * oder ein wchar_t const * je nach dem ob UNICODE definiert ist oder nicht.

    Davon abgesehen: Wenn man nicht unbeding mit der WinAPI zu tun hat (UNICODE nur in der UTF-16 Geschmacksrichtung) dann tut man gut daran sich an http://utf8everywhere.org/ zu halten.



  • @Th69 Es geht jetzt. Lag wohl daran das ich zwei hwndEdit Fenster-Childs hatte und sie sich in die Quere kamen. Hab jetzt einfach den Namen vom anderen Fenster geändert und jetzt geht alles reibungslos. Danke für das erklären der Byte Order Mark. Desweitern würde ich gern erstmal bei der WinApi bleiben um mein erstes kleines Windows-Programm zu beenden, doch dann schau ich auch gern mal in ein passendes Framework dafür rein.
    PS: Hab den Standard Windows Texteditor benutzt, aber das ist ja jetzt eh irrelevant. Danke nochmal für die Hilfe bei meinem Problem!



  • @Swordfish Kannte ich noch nicht sieht aber ganz gut aus. Danke für den Tipp!



  • @Swordfish sagte in wchar_t speichert nicht den Text?:

    Hexeditor ist eigentlich ein Tool das man immer rumliegen haben sollte. Frhed ist ganz nett.

    Ich finde https://mh-nexus.de/en/hxd/ gut.


Log in to reply