[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 gut

    char 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
    lukas

    Info: 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 code

    CreateFile(_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 auf

    WriteFile(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 geklappt

    nochmal 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


  • Mod

    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?


Anmelden zum Antworten