istream >> string : bestimmte laenge n in string schreiben



  • hola leute

    hab in einer datei 'binaere' strings gespeichert

    aufbau:

    [laenge n: 4 byte binaer][string mit der laenge n]
    

    nun will ich den binaeren string in einen std::string reinschreiben. wie mach ich das am besten ?
    bis jetzt hab ich einen buffer dynamisch allokiert, da den string reingeschrieben und mittels assign dem std::string zugewiesen. geht das nicht auch anders ? so muss fuer den string ja 2 mal speicher angefordert werden.
    dachte das es vielleicht mit istream_iteratoren funktionieren koennte, scheint aber nicht so zu sein.

    Meep Meep



  • hmm? file_stream.read(static_cast<const char*>(len_data), sizeof(len_data) /* = 4 */) ...



  • getline hat doch auch ein Argument in dem die maximale länge festgelegt wird ...



  • darthdespotism schrieb:

    getline hat doch auch ein Argument in dem die maximale länge festgelegt wird ...

    Aber nicht die Variante, die einen std::string verarbeitet.

    (D)Evil schrieb:

    hmm? file_stream.read(static_cast<const char*>(len_data), sizeof(len_data) /* = 4 */) ...

    In wie weit hat das mit der Frage zu tun? Die war doch, wie man sich die (zweite) Allokation spart. Oder irre ich mich da?

    @Meep Meep
    Da std::string das Memory-Management komplett übernimmt (und kapselt), gibt es da leider keine Möglichkeit. Die Alternative wäre die Verwendung eines std::vector<char>. Den könntest du erst passend resizen und dessen Speicher dann direkt als Ziel der Einlesefunktion verwenden. Selbiges geht für einen std::string nicht, da hier nicht garantiert ist, dass der Speicher "am Stück" verwaltet wird.



  • hola

    hab jetzt grad keinen compiler zum tsten zur hand, aber ich glaub ich werde das foglend loesen:

    void ReadBinaryFromStream(std::istream &in, std::string &str)
    {
       std::size_t len;
       ReadBinaryFromStream(in, len); /* hier hole ich mir die string-laenge */
       if(len == 0)
          return;
    
       str.reserve(len + 1); /* speicher reservieren */ 
       std::streambuf *buf = in.rdbuf();
       while(len--)
          str += static_cast<char>(buf->sbumpc());
    }
    

    zwar nicht hochperformant, aber nach dem die strings meistens nicht laenger als 32 zeichen sind, sollte das schon passen.

    Meep Meep


Anmelden zum Antworten