 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Sascha T. Guest
|
Posted: Tue Feb 22, 2005 9:02 am Post subject: String to int mit stringsteams |
|
|
Hi!
Ich habe ein kleines Verständnisproblem mit stringstreams.
Um zu verdeutlichen, worum es mir geht, habe ich einen
kleinen Code im C-Stil geschrieben, der genau das macht,
was ich gerne im C++-Stil mit stringstreams, d.h.
ohne atoi, sprintf und cast-operatoren, umsetzen würde:
===============================
#include <iostream>
#include <string>
using namespace std;
int main()
{
int first(0),last(0);
string sfirst("1"), slast("5"), buffer("");
string prefix("Pre."), postfix(".post");
char c[100];
first=atoi(sfirst.c_str());
last=atoi(slast.c_str());
for(int i(first); i<=last; i++)
{
sprintf(c,"%s%d%s",prefix.c_str(),i,postfix.c_str());
buffer=string (c);
cout << buffer << endl;
}
return 0;
}
===============================
Ich kapiere einfach das Konzept der Stringstreams nicht.
Ich weiss, ich könnte folgendes machen um "first" den
Wert von sfirst zuzuweisen:
istringstream sbuf;
sbuf.str(sfirst); sbuf >> first;
Doch
sbuf.str(slast); sbuf >> last;
klappt nicht...
Auch die ostringstream-Lösung als Ersatz für sprintf ist mir
vollkommen undurchsichtig.
HILFE!!!!!
Danke im Voraus
ST
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Tue Feb 22, 2005 7:43 pm Post subject: Re: String to int mit stringsteams |
|
|
"Sascha T." <djiwehweuhfwei (AT) spammotel (DOT) com> writes:
| Quote: | Ich weiss, ich könnte folgendes machen um "first" den
Wert von sfirst zuzuweisen:
istringstream sbuf;
sbuf.str(sfirst); sbuf >> first;
Doch
sbuf.str(slast); sbuf >> last;
|
Das kann davon herrühren, dass das eof-Bit gesetzt ist in sbuf, weil
beim Lesen von first sfirst bis zum Ende durchgearbeitet wurde.
Am einfachsten verwendest Du für last ein neues istringstream-Objekt.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Tue Feb 22, 2005 8:03 pm Post subject: Re: String to int mit stringsteams |
|
|
Sascha T. <djiwehweuhfwei (AT) spammotel (DOT) com> wrote:
| Quote: | Hi!
Ich habe ein kleines Verständnisproblem mit stringstreams.
Um zu verdeutlichen, worum es mir geht, habe ich einen
kleinen Code im C-Stil geschrieben, der genau das macht,
was ich gerne im C++-Stil mit stringstreams, d.h.
ohne atoi, sprintf und cast-operatoren, umsetzen würde:
|
Na dann versuch ich mal das analog umzusetzen, ich habe lange nicht mehr
den C Kram benutzt.
#include <string>
#include <ostream>
#include <sstream>
#include <iostream>
int main() {
int sfirst, slast;
char const* const input = "1 5";
std::ostringstream ostream;
std::istringstream istream (input);
istream >> sfirst >> slast;
for (int i = sfirst; i != slast; ++i) {
ostream << "Pre." << i << ".postn";
}
std::cout << ostream.str ();
return 0;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Kern Guest
|
Posted: Tue Feb 22, 2005 9:07 pm Post subject: Re: String to int mit stringsteams |
|
|
Am Tue, 22 Feb 2005 10:02:32 +0100 schrieb Sascha T.:
| Quote: | djiwehweuhfwei (AT) spammotel (DOT) com
|
Ah! Vielen Dank für die Mühe! Habs ausprobiert und das Programm
macht genau das, was es soll, trotzdem kapier ich's nicht!
Ich habe bereits im Stroustroup, 2 C++ Büchern und diversen
Tutorials aus dem Netz nachgeschlagen und nachgelesen. Ich
glaube, bei mir hakt es prinzipiell am Verständnis des
Konzeptes von STREAMS.
Wenn es nicht zuviel verlangt ist, wäre ich für die
Beantwortung folgender Fragen sehr dankbar:
1. Wie genau ist eigentlich ein "Stream" charakterisiert?
2. Was genau passiert hier:
istringstream istream (input);
istream >> sfirst >> slast;
3. Was müsste ich tun, wenn input zwei Strings wären?
4.
for (int i = sfirst; i != slast; ++i) {
ostream << "Pre." << i << ".postn";
}
Hier wird also ein ostream "gefüllt", verstehe. Was, wenn
ich jeden einzelnen Pre.X.post in einem String speichern wollte?
Oje, oje...
Gruss & Danke nochmal für jede Mühe
M.K
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Kerry W. Lothrop Guest
|
Posted: Tue Feb 22, 2005 9:25 pm Post subject: Re: String to int mit stringsteams |
|
|
| Quote: | istringstream sbuf;
sbuf.str(sfirst); sbuf >> first;
sbuf.str(slast); sbuf >> last;
Das kann davon herrühren, dass das eof-Bit gesetzt ist in sbuf, weil
beim Lesen von first sfirst bis zum Ende durchgearbeitet wurde.
Am einfachsten verwendest Du für last ein neues istringstream-Objekt.
|
Oder du löschst alle Failbits mit sbuf.clear().
Kerry
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Tue Feb 22, 2005 10:22 pm Post subject: Re: String to int mit stringsteams |
|
|
[email]pausz (AT) stud (DOT) uni-frankfurt.de[/email] (Tibor Pausz) writes:
| Quote: | Sascha T. <djiwehweuhfwei (AT) spammotel (DOT) com> wrote:
Hi!
Ich habe ein kleines Verständnisproblem mit stringstreams.
Um zu verdeutlichen, worum es mir geht, habe ich einen
kleinen Code im C-Stil geschrieben, der genau das macht,
was ich gerne im C++-Stil mit stringstreams, d.h.
ohne atoi, sprintf und cast-operatoren, umsetzen würde:
Na dann versuch ich mal das analog umzusetzen, ich habe lange nicht mehr
den C Kram benutzt.
#include <string
#include
#include
#include
int main() {
int sfirst, slast;
char const* const input = "1 5";
std::ostringstream ostream;
std::istringstream istream (input);
|
Die Variablennamen ostream und istream sind sehr verwirrlich
(zumindest für mich).
| Quote: | istream >> sfirst >> slast;
|
Wenn diese Eingabe misslingt ...
| Quote: | for (int i = sfirst; i != slast; ++i) {
|
sind sfirst und slast uninitialisiert, und das Programm hat
undefiniertes Verhalten.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue Feb 22, 2005 11:46 pm Post subject: Re: String to int mit stringsteams |
|
|
Thomas Maeder wrote:
| Quote: | pausz (AT) stud (DOT) uni-frankfurt.de (Tibor Pausz) writes:
Sascha T. <djiwehweuhfwei (AT) spammotel (DOT) com> wrote:
Hi!
Ich habe ein kleines Verständnisproblem mit stringstreams.
Um zu verdeutlichen, worum es mir geht, habe ich einen
kleinen Code im C-Stil geschrieben, der genau das macht,
was ich gerne im C++-Stil mit stringstreams, d.h.
ohne atoi, sprintf und cast-operatoren, umsetzen würde:
Na dann versuch ich mal das analog umzusetzen, ich habe lange nicht mehr
den C Kram benutzt.
#include <string
#include
#include
#include
int main() {
int sfirst, slast;
char const* const input = "1 5";
std::ostringstream ostream;
std::istringstream istream (input);
Die Variablennamen ostream und istream sind sehr verwirrlich
(zumindest für mich).
istream >> sfirst >> slast;
Wenn diese Eingabe misslingt ...
for (int i = sfirst; i != slast; ++i) {
sind sfirst und slast uninitialisiert, und das Programm hat
undefiniertes Verhalten.
|
Dann mach daraus:
if (istream >> sfirst >> slast)
{
for (int i = sfirst; i != slast; ++i)
//...
}
else
{
std::cout << "errorn";
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Feb 23, 2005 12:02 am Post subject: Re: String to int mit stringsteams |
|
|
Markus Kern wrote:
| Quote: | Am Tue, 22 Feb 2005 10:02:32 +0100 schrieb Sascha T.:
|
Hast du inzwischen deinen Namen geändert?
| Quote: | Wenn es nicht zuviel verlangt ist, wäre ich für die
Beantwortung folgender Fragen sehr dankbar:
1. Wie genau ist eigentlich ein "Stream" charakterisiert?
|
Ein Stream ist ein Objekt zur Ein-/Ausgabe-Formatierung. Es enthält einen
Streambuf, der dann die eigentliche Ein-/Ausgabe übernimmt (bei cout z.B.
auf dem Bildschirm, bei einem fstream in eine Datei, bei einem stringstream
in einen String).
| Quote: | 2. Was genau passiert hier:
istringstream istream (input);
|
Ein Lesestream vom Typ istringstream wird erzeugt, und sein streambuf mit
dem Inhalt von input initialisiert.
| Quote: | istream >> sfirst >> slast;
|
Von welchem Typ sind den sfirst und slast? Im Ursprungsposting waren sie
std::string. In diesem Fall wird aus dem String im istream (der von input
kam) bis zum ersten Whitespace gelesen und das Ergebnis in sfirst
geschrieben. Dann wird bis zum nächsten Whitespace gelesen und das Ergebnis
nach slast geschrieben. Aber ich dachte, du wolltest Integers haben. Die
kannst du allerdings auf die gleiche Art auslesen.
| Quote: | 3. Was müsste ich tun, wenn input zwei Strings wären?
|
Kommt drauf an. Sollen sie einfach hintereinander wie ein großer String
behandelt werden? Dann schreib einfach:
istringstream istream(input1 + input2);
Wenn sie getrennt behandelt werden sollen, kannst du das etwa so machen:
istringstream istream(input1); //stream mit dem ersten String initialisieren
//aus dem stream lesen
istream.clear(); //Fehlerbits zurücksetzen
istream.str(input2); //nächsten String in den Stream übergeben
//wieder aus dem Stream lesen
Oder eben für jeden String einen eigenen Stream erzeugen.
| Quote: | 4.
for (int i = sfirst; i != slast; ++i) {
ostream << "Pre." << i << ".postn";
}
Hier wird also ein ostream "gefüllt", verstehe. Was, wenn
ich jeden einzelnen Pre.X.post in einem String speichern wollte?
|
for (int i = sfirst; i != slast; ++i) {
ostringstream ostream;
ostream << "Pre." << i << ".postn";
std::string str(ostream.str());
//tu was mit str
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Sascha T. Guest
|
Posted: Wed Feb 23, 2005 9:02 am Post subject: Re: String to int mit stringsteams |
|
|
Hi Rolf!
Vielen Dank für deine Ausführungen! Diese waren mir
sehr nützlich. Ich dachte, Streams wären nur so was
wie Variablen oder Templates (ich weiss, letzteres
ist sehr weit hergeholt, aber ich dachte es halt).
Also, ich werde mir die ganze Sache dann nochmal durch
den Kopf gehen lassen und ein bisserl rumprobieren.
Gruss
& Dank
STMK
Am Wed, 23 Feb 2005 01:02:49 +0100 schrieb Rolf Magnus:
| Quote: | Hast du inzwischen deinen Namen geändert?
|
Psst!
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Sun Feb 27, 2005 10:42 am Post subject: Re: String to int mit stringsteams |
|
|
Thomas Maeder <jvxexluzrgmr (AT) mailinator (DOT) com> wrote:
| Quote: | istream >> sfirst >> slast;
Wenn diese Eingabe misslingt ...
|
Äh ja, war etwas auf die schnelle geschrieben. sfirst und slast sollte
man vorher initialisieren und nach der Einlesen überprüfen ob sfirst
kleiner ist als slast.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|