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