String / Schreiben in Datei / Zeichen fehlen



  • Hallo,

    ich bin beim Arbeiten eben auf einen Umstand gestoßen, den ich gern verstehen würde:
    Ich habe das Sockets-Tutorial angepaßt, weil ich nicht in eine Datei schreiben wollte, sondern einen std::string antworten möchte.

    Also habe ich an den entsprechenden Stellen parallel zum Dateischreiben (fout = fstream)

    fout.write(buf, bytesRecv);
    

    meinen Code eingefügt (dateiinhalt ist ein einfacher string):

    dateiinhalt += buf;
    

    .

    Der Test zeigte, dass das ganze anscheinend funktioniert (ich parse den Text nur an bestimmten Stellen, kann also sein, daß ich Unterschiede nicht bemerke).
    Danach wollte ich das Dateischreiben eigentlich entfernen, dachte aber, dass ich es zum Debuggen doch drin lasse und wollte nur ganz am Ende ggf. (debug-flag) eine Datei dumpen:

    fout2.write(dateiinhalt, dateiinhalt.size());
    

    Im letzteren Fall fehlen am Dateiende aber einige Zeichen.
    Wie kommt das?!
    Ist size nicht korrekt, weil die Anzahl der Bytes ungeleich der Zeichen sind (Unicode, Multibyte)? Immerhin ist die geladene Datei eine HTML.

    Wie gesagt, ich möchte das Verstehen. Ein Implementierung bekomme ich im Zweifel auch anders hin.



  • dateiinhalt.append(buf, bytesRecv);
    


  • append schrieb:

    dateiinhalt.append(buf, bytesRecv);
    

    Danke.
    Aber zum einen beantwortet das noch nicht genz meine Frage und zum anderen möchte ich das ja wie schon geschrieben verstehen: Was also macht 'append' denn anders als '+='?



  • meine glaskugel sagt:

    operator+= erwartet (hier wahrscheinlich) einen C-string, aka nullterminierter byte string. das heißt, er liest so lange zeichen, bis er auf '\0' stößt. da buf aber wahrscheinlich nicht nullterminiert ist (du hast ja immerhin in bytesRecv eine länge gespeichert), liest += einfach weiter, bis es zufällig im speicher an eine 0 gelangt - und das im besten fall. anderer fall (ist vielleicht bei dir so): du hast eine 0 mitten in den daten - operator+= hört dann an dieser stelle auf, zeichen anzuhängen und du hast zu wenig zeichen im string.

    std::string ist aber kein C-string. std::strings dürfen sogar '\0' beinhalten, es ist ihnen völlig egal. deshalb bieten sie funktionen wie z.b. append an, mit der du eine gewisse anzahl von zeichen (ob mit oder ohne 0) anhängen kannst.

    wenn es ohne std::string funktioniert hat, und buf ein zeiger auf char ist, wird es wohl nicht am unicode liegen.



  • Hmmm, ich habe die beiden Dateien verglichen und es fehlte wirklich nur am Ende etwas. Ich teste das noch einmal mit einer anderen HTML-Seite. Mal sehen. Und dann baue ich das mal auf append um.

    ---

    Ja, sieht mit append besser aus.
    Zunächst dachte ich jetzt, dass bei Detein gleich kürzer sind als die Originaldatei, das lag aber wohl nur an einem Breakpunkt hinter dem letzten Schrieben. Vielleicht war der Stream noch nicht geflusht. Ohne paßte alles wieder.
    THX @all!


Anmelden zum Antworten