036
12.09.2006, 10:42 Uhr
virtual
Sexiest Bit alive (Operator)
|
Jetzt habe ich mir doch mal eine UNIX Kiste gekrallt und eine C++ Compiler angeworfen...
Du hast so noch immer ein Problem, denke ich. Dieses Einfache Programm sei gegeben:
C++: |
#include <sstream> #include <iostream> #include <iterator>
int main() { std::stringstream o; o<<"Hallo, Welt"<<std::endl; std::copy(std::istream_iterator<char>(o), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout)); o.clear(); std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;
o<<"Hallo, Welt"<<std::endl; std::copy(std::istream_iterator<char>(o), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout)); o.clear(); std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;
// DER IST WICHTIG: o.str("");
o<<"Hallo, Welt"<<std::endl; std::copy(std::istream_iterator<char>(o), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout)); o.clear(); std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl; }
|
Was gemacht wird, ist ein paar mal hintereinander den Stringstream nach std::cout zu kopieren. das clear ist schon eingebaut. Zu beachten sind die Zeilen:
C++: |
std::cout<<"I/O position: "<<o.tellg()<<"/"<<o.tellp()<<std::endl;
|
Wie Du anhand der Ausgabe siehst, erhöhen sich die Dateizeiger von o mit Jeder ausgabe. Dh letztlich bewirkt das copy lediglich, daß ein Teil on o jeweils rausgeschrieben wird; der rausgeschriebene Teil bleibt aber stets im Speicher zurück. Dh wenn Du auf diese Art deine 5 GB Stückweise wegschreibst, hast Du eigentlich dennoch irgendwo 5 GB im Speicher. Ich würde also generell hinter dem std::copy die beiden Zeilen:
C++: |
stream.clear(); stream.str("");
|
spendieren. Die zweite Zeile setzt den Stream auf den Inhalt "" zurück. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |