std::stringstream, << und >>, Buffer leeren
-
Hi,
Ich möchte gerne die
std::stringstream
klasse verwenden, um Zahlen von strings nach int zu konvertieren.
Ich habe eine feste Puffergröße angegeben. Ich konvertiere mit:std::string string; std::stringstream strstr << string;
Wie gesagt habe ich den Buffer für den Stringstream gesetzt.
Wenn ich ihn anschaue, dann enthält er nun die richtige Zahl welche instring;
gestanden ist. (Buffer[0] ist dann gleich der zahl welche in sting steht)
Dann kommt noch eine weitere anweisung.unsigned long Zahl; strstr << Zahl;
Leider wird die Zahl nicht mehr übernommen. Der buffer bleibt auf der Zahl , welche in
string;
gestanden ist. Ich habe vor
strstr << Zahl;
es schon mit sync und flush versucht. Auch seekp(0). Aber jene Zahl, welche ich zuerst geschrieben habe ist nicht mehr aus dem Buffer raus zu kriegen.
Wichtig istnoch, daß der buffer automatisch so groß gewählt wird, wie die zahl in string ist. Also nach der ersten schreiboperation ist der buffer voll.
Die zweite zahl soll die alte zahl überschreiben.
Funktionieren tut es, wenn ich zwei stringstreams verwende. Das will ich aber vermeiden.
Danke für Hilfe im Vorraus,
Gruß
-
Was meinst du denn mit dem "Buffer"? Und was willst du jetzt eigentlich genau erreichen?
-
Hi,
Also mein Ziel ist es seinen string in dem eine zahl steht in eine berechenbare Zahl zu verwandeln.
Buffer ist:std::streambuf *str_buf; char *Buffer; Buffer =new char [String.size()]; str_buf=strstr.rdbuf()->pubsetbuf(Buffer,string.size());
gruß
-
AlexXXx
Hi,
Ich möchte gerne die
std::stringstream
klasse verwenden, um Zahlen von strings nach int zu konvertieren.Ich weiss zwar nicht was du da mit irgendeinem Buffer machst und so.
Aber eine Zahl in einen string Konvertieren das geht so:
#include <iostream.h> #include <sstream.h> using namespace std; int main() { unsigned long zahl = 10; // int anstatt unsinged long geht natürlich auch string zahl_als_string; stringstream int_to_string; int_to_string << zahl; int_to_string >> zahl_als_string; cout<<"Ausgabe:: " << zahl_als_string <<endl; system("PAUSE"); }
-
Das Problem ist, daß ich, nach dem ich einmal in strstr geschrieben habe mit <<
, die zeichen nicht wieder raus bekomme. Ich muß einen neuen alegen, und dasß will ich nicht, zumal ich die alten zeichen icht weiter benötige.
Wenn ich zwei strstr benutze , funktioniert es. Oder sie jedesmal mit new und delete erzeuge oder zerstöre. Aber das ist behämmert. Ich muß doch irgendwie sagen können wie ich die schreibpositionen der << >> operatoren angeben kann.
Es funktioniert nicht mit sync flush seekp.
Gruß
-
So ?
oder meinste so?
[cpp}
str << string_zahl;
// str >> ganz_zahl; <-- mit nur 1 str
[/cpp]#include <iostream.h> #include <sstream.h> using namespace std; int main() { unsigned long ganz_zahl; unsigned long erg; string string_zahl = "18"; stringstream str; str << string_zahl; str >> ganz_zahl; erg = ganz_zahl + 20; cout<<"Ausgabe: "<<erg<<endl; system("PAUSE"); }
-
Genau so mache ich es auch.
Der Buffer ist unwichtig. Deswegen habe ich ihn nicht beschrieben beim ersten Versuch.
Die Konvertierung geht wie du gesagt hast und so mache ich es auch.
Die Zahl welche man konvertieren will wird ja intern in einem Buffer gespeichert.
Wenn man sich den anschauen will, dann kann man den Pointer drauf selber setzen.
Ich habe den Buffer nur gesetzt, um mir anschauen zu können, wei die Klasse intern arbeitet.
Das problem ist, daß nach einmaligem Schreiben einer Zahl, welche den gesamten Buffer der stringstream Instanz füllt, die Zahl nicht wieder überschrieben werden kann.
Also pro zu konvertierenden Zahl brächte ich eine stringstream Instanz.
Und das ärgert micht =).
-
Den stringstream müsstest Du mit
strstr.set("");
leeren können
-
Das Zweite Besipiel trifft es genau.
und dann zusätzlich (Ich verwende deine c++ typen entsprechend zu den Bezeichnern)str << string_zahl_2; str >> ganz_zahl;
Bei mir steht dann in ganz_zahl die string_zahl, und nicht
string_zahl_2.
Es kann sein, daß es ohne Buffervorgabe klappt, weil nach dem erstenstr << string_zahl; str >> ganz_zahl;
Bei mir der Buffer der stringstream klasse voll ist.
Gruß
-
HI,
GCC meldet:MTX_file.cpp:71: Fehler: »struct std::stringstream« hat kein Element namens »set«
Also die methode ist nicht impelemtiert.
Aber genau anch so einer Methode suche ich.
-
AlexXXx schrieb:
HI,
GCC meldet:MTX_file.cpp:71: Fehler: »struct std::stringstream« hat kein Element namens »set«
Also die methode ist nicht impelemtiert.
Aber genau anch so einer Methode suche ich.
Muss ja auch
strstr.str("");
heissen (ich Deppl, ich ;))
-
Deine Methode ist auch gut. Sie arbeitet leider für mich nicht wie sie soll, wenn ich den Buffer mit angebe.
Mir am saubersten erschien mir, (am saubersten, weil ich den Bufferinhalt einzeln auslesen kann, und beobachten welche Bufferdaten überschrieben werde) die Folgende.std::string str("*****"); unsigned long tmp_z=0; char *Buffer; // Der Stringstream std::stringstream strstr; // Da ich den Puffer mit angeben möchte, benötige ich einen Zeiger // auf den mit dem Stringstream assoziierten std::stringbuf. // Dabei ist std::stringbuf von std::streambuf abgeleitet !!! std::stringbuf *string_buf; // Der pointer für den Buffer Buffer =new char [str.size()]; // Den mit dem Stringstream assoziierten streambuffer holen string_buf=tmp_ss.rdbuf(); // Den Buffer setzen string_buf->pubsetbuf(Buffer,str.size()); // Den String in den Stringstream schreiben strstr << str; // Ab hier kann man sich Buffer ausgeben lassen. Er enthält die selben Zeichen // wie str // !!! Es werden error flags gesetzt wie das eof bit !!! // Stringstream in Zahl konvertieren strstr >> tmp_z; // Zahl verändern tmp_z*=2; // Den put pointer von std::stringstream auf den Anfang setzen strstr.seekp(0); // Die Statusflags resetten !!! Wichtig, das hat vorher gefehlt !!! strstr.clear(); // Erneut in die Stringstreamklasse schreiben // Die alten daten werden überschrieben. // Es wird der zu Anfang angegebene Buffer verwendet strstr << tmp_z;
Hier kann man sich in jedem Zwischenschritt die Daten im Buffer anschauen, welche dann konsisten zu den ein und ausgaben von strstr sind.
Deswegen bevorzuge ich diese Mathode.
Denkbar noch genau die Selbe methode nur ohne die übergabe des buffers.Gruß
-
Vielleicht verstehe ich da was nicht, aber wieso gibst du den "Buffer"-Inhalt nicht mit
cout << strstr.str();
aus?