C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

String to int mit stringsteams

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Sascha T.
Guest





PostPosted: Tue Feb 22, 2005 9:02 am    Post subject: String to int mit stringsteams Reply with 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:


===============================

#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





PostPosted: Tue Feb 22, 2005 7:43 pm    Post subject: Re: String to int mit stringsteams Reply with quote



"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





PostPosted: Tue Feb 22, 2005 8:03 pm    Post subject: Re: String to int mit stringsteams Reply with quote



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





PostPosted: Tue Feb 22, 2005 9:07 pm    Post subject: Re: String to int mit stringsteams Reply with quote

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





PostPosted: Tue Feb 22, 2005 9:25 pm    Post subject: Re: String to int mit stringsteams Reply with quote

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





PostPosted: Tue Feb 22, 2005 10:22 pm    Post subject: Re: String to int mit stringsteams Reply with quote

[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





PostPosted: Tue Feb 22, 2005 11:46 pm    Post subject: Re: String to int mit stringsteams Reply with quote

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





PostPosted: Wed Feb 23, 2005 12:02 am    Post subject: Re: String to int mit stringsteams Reply with quote

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





PostPosted: Wed Feb 23, 2005 9:02 am    Post subject: Re: String to int mit stringsteams Reply with quote



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





PostPosted: Sun Feb 27, 2005 10:42 am    Post subject: Re: String to int mit stringsteams Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.