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!
-
@Felix sagte in wchar_t speichert nicht den Text?:
Was speichert wchar_t?
Fundamental Types | Character types
Windows: Docs / Microsoft C++, C, and Assembler / C++ language / C++ language reference / Built-in types / char, wchar_t, char16_t, char32_t
-
Du hast dir ja auch die Adresse der Variablen
buff
ausgeben lassen (da es keine Überladung beiofstream
für einenwchar_t*
gibt).
Also entweder einenwofstream
benutzen oder eine passende Konvertierungsfunktion.PS: Du solltest dann auch explizit
GetWindowTextW
benutzen (um nicht abhängig vom MakroUNICODE
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. Hierchar
oderwchar_t
. Hängt davon ab obUNICODE
definiert ist oder nicht.
W
steht für Wide Character,wchar_t
.
LPSTR
ist ein long pointer to string, also einchar*
(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 einwchar_t*
LPCTSTR
ist ein long pointer to constant T string wobeiT
fürchar
oderwchar_t
steht. Also einchar const *
oder einwchar_t const *
je nach dem obUNICODE
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.