Buffer
-
Hallo zusammen,
ich möchte Daten aus einem Stream lesen und je nach Inhalt
brauche ich mal mehr mal weniger Bytes.
Jetzt hab ich ja die Möglichkeit mit realloc meinen bisherigen
Speicherplatz zu vergrößern. Jetzt hab ich zum beispiel 4KB
eingelesen und benötige in den ersten 3 KBs die Daten nicht mehr.
Kann ich die irgendwie schon freigeben, oder muss ich dann manuell
in einen neuen Speicherbereich (bzw. an den Anfang des existierenden)
kopieren (und freigeben natürlich bei neuer Speicheranforderun)?Gruß,
*Cpp-Anfänger*EDIT: Nach Möglichkeit unter Verwendung der Standardlibrary
-
realloc() kopiert dir selbständig den alten Speicherinhalt - allerdings genau den Anfangsblock, den du nicht mehr benötigst. Also mußt du die Daten von Hand umkopieren, indem du den hintersten Teil deiner Daten vor dem realloc() nach vorne verschiebst.
(ehe ich es vergesse - dafür kannst du die Funktion man: memmove verwenden)
-
Ich hab gerade mal etwas gegoogelt und
bin gerade auf den std::stringbuf bestossen.
Mach der nicht beim Aufruf von setg() genau das, was ich wollte?Also verwirft er den Teil vor dem ersten Parameter oder wofür sind die Grenzen?
Vielen Dank,
*Cpp-Anfänger*
-
std::stringbuf ist c++.
bei welcher sprache willst du nun bleiben?
-
stringbuffer werden intern von stringstreams verwendet, um die eingegebenen Daten zu verwalten. Und setg() setzt dort drin eine interne Markierung, wo die Daten beginnen bzw. enden - das löscht und verschiebt überhaupt nichts.
Wenn du wirklich mit C++ arbeiten willst, solltest du einen std::string verwenden, dort die Daten per append()/push_back() anhängen und mit erase() am vorderen Ende wieder löschen.
-
Danke CStoll...
und in welcher Datenstruktur verwaltest du die Daten, wenn es
Binärdaten sind?
Auch in std::string?
-
Ja, kann man auch machen, aber dann eher std::vector<...>.
-
Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Wenns nicht Performance-kritisch ist einfach einen std::vector<char> / std::vector<unsigned char> verwenden und dort erase() aufrufen wenn du den Anfang nichtmehr brauchst. Wenns allerdings Performance-kritisch ist bastel dir einen Ring-Buffer der realloc-fähig ist. Zur Implementierung kannst du entweder einen std::vector verwenden, oder eine std::deque, wobei die std::deque dann aber schön grosse Klötze als Element haben sollte (definitiv > 1kb) -- oder natürlich alles selbst wasteln, aber das wäre ein IMHO unnötiger Aufwand.