[gelöst]char array bearbeiten
-
hallo,
diese frage wurde bestimmt schon einmal gestellt -> habe aber auch in google nichts passendes gefunden.
Ich habe einen Dialog und in diesem ein Editfeld->
wenn man im dialog auf einen button klicken soll, soll eine datei mit dem namen des eingegebenen strings erstellt werden.
soweit so gutchar buffer[128]; GetDlgItemText(hDlg, ID_EDUSERPROFILNAME, (LPWSTR)buffer, 128);in buffer ist jetzt der name gespeichert. mit createfile möchte ich jetzt die datei speichern und das klappt auch.
CreateFile((LPWSTR)buffer,(GENERIC_READ | GENERIC_WRITE),0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);wie kann ich jetzt aber der datei eine endung geben?
in buffer soll jetzt also <editeingabe>.txt/cfg was auch immer stehen.ich bin schon auf strcat gestoßen, wenn ich das aber versuche wird die eingabe in chinesische zeichen umgewandelt
-> denke das liegt an unicode o.ä.vielen dank für die hilfe
lukasInfo: Programm Vc++ 2010 express
-
luckylukas92 schrieb:
ich bin schon auf strcat gestoßen, wenn ich das aber versuche wird die eingabe in chinesische zeichen umgewandelt
-> denke das liegt an unicode o.ä.Nachdem du ständig Casts nach LPWSTR verwendest, würde ich sagen, damit liegst du richtig. Da solltest du lieber gleich den richtigen Datentyp verwenden (sollte TCHAR heißen) und dafür hat MS eine Variation von strcat im Angebot - diese nennt sich _tcscat().
-
hay danke, das war die lösung
-> hier der richtige codeCreateFile(_tcscat((LPWSTR)buffer,_T(".txt")),(GENERIC_READ | GENERIC_WRITE),0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);//gelöst
-
Und wenn du jetzt noch das char-Array durch ein
TCHAR buffer[128];ersetzt, kannst du auch die Casts weglassen
(btw, ich hoffe du weißt, daß du nicht über das Array-Ende hinausschreiben solltest)
-
danke für den tip!
ich bin sehr neu in c++ habvor ner weile schinmal was getestet und wollte mich jetzt noch einmal wagen die winapi an zu fassen
ich komme von php ... da ist man mit deklarationen ein wenig frei zügiger
also hier nochmal der code
HANDLE file; GetDlgItemText(hDlg, ID_EDUSERPROFILNAME, buffer, 128); file=CreateFile(_tcscat(buffer,_T(".cfg")),(GENERIC_READ | GENERIC_WRITE),0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);und gleich zu meinem nächsten problem
gebe ich jetzt im editfeld einen string ein und betätige das event wird die datei erfolgreich erstellt.
natürlich möchte ich die datei nicht nur erstellen, sondern auch noch etwas in sie schreiben.im internet habe ich gelesen(finde die quelle gerade nicht), dass man das nicht mit den konsolen befehlen machen sollte.
-> deswegen dachte ich mir "schau mal in msdn" und dort bin ich aufWriteFile(file,buffer,sizeof(buffer),NULL,NULL);gestoßen
gebe ich als bsp. "lukas" in das edit feld ein wird die datei "lukas.cfg" richtig erstellt.
schaue ich allerdings in die datei erscheint sowas
l u k a s . c f g ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ(und so weiter)...
die leerzeichen entstehen warscheinlich durch die doppelte bit länge der unicode zeichen? und die Ì durch die unbenutzten chars von buffer?was schafft da abhilfe?
MfG Lukas
-
sizeof() gibt die gesamte Länge des Arrays an (inklusive dem Platz, der eigentlich ungenutzt ist). Um die Länge der verwendeten Daten zu bekommen, nutzt man die Null-Terminierung von C-Strings aus und verwendet strlen() (bzw. _tcslen()). Dabei mußt du aber noch die Zeichengröße berücksichtigen, sonst schreibst du nur die Hälfte der Daten.
PS: Ja, die Leerzeichen dürften durch die UNICODE-Darstellung entstehen und sind eigentlich 0x00 Bytes.
-
okay vielen vielen dank
es hat alles geklapptnochmal der vollständige code für leute diie hier drüber stolpern:
//lösung für das unicode problem char unicode_mark[ ] = { 0xFF, 0xFE }; unsigned long written; WriteFile(file,&unicode_mark, 2, &written,NULL); //lösung für 0 terminierte strings WriteFile(file,buffer,_tcslen(buffer)*2,&written,NULL);MfG Lukas
-
Das ganze hätte man mit der CRT und fopen und dem entsprechenden Encoding einfacher haben könne.
Dadurch wird auch der BOM korrekt geschrieben:
Siehe fopen...
http://msdn.microsoft.com/en-us/library/yeby3zcb.aspx
-
naja, wenn die funktion aber doch extra für die winapi gibt muss es doch auch vorteile haben?