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 

zahlen aus dem string einlesen

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





PostPosted: Mon Jun 20, 2005 3:47 pm    Post subject: zahlen aus dem string einlesen Reply with quote



Hallo NG

gibt es eine Möglichkeit bequem(ohne string zu parsen)
die Zahlen aus einem String auszuelesen.
zB

std::string line = "0 [1] 2 8 12 32";

die Lösung mit atoi(buffer), wo ich den buffer mit rausgeparsten
Zahlen fülle, funktioniert zwar, aber ich werde das Gefühl nicht los
dass es keine gute C++ Lösung ist.

MfG

Daniel

--
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: Mon Jun 20, 2005 5:00 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote



Daniel Schüle <uval (AT) rz (DOT) uni-karlsruhe.de> writes:

Quote:
gibt es eine Möglichkeit bequem(ohne string zu parsen)
die Zahlen aus einem String auszuelesen.

Das tönt nach einem Widerspruch.


Quote:
std::string line = "0 [1] 2 8 12 32";

die Lösung mit atoi(buffer), wo ich den buffer mit rausgeparsten
Zahlen fülle, funktioniert zwar, aber ich werde das Gefühl nicht los
dass es keine gute C++ Lösung ist.

atoi() funktioniert eigentlich nie, weil man nicht feststellen kann,
ob die Konvertierung geklappt hat. Wenn schon strtoul() o.ä..


Für eine gute Lösung müsste man zuerst die Anforderungen kennen. Soll
z.B. im oben angebenen string 1 auch gefunden werden?

--
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 Zimmermann
Guest





PostPosted: Mon Jun 20, 2005 6:27 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote



Hallo

Quote:
gibt es eine Möglichkeit bequem(ohne string zu parsen)
die Zahlen aus einem String auszuelesen.

Ohne Parser wirst Du sicher nicht sehr weit kommen. Bei boost
gibt es u.a. einen einfachen Parser fuer solche trivialen
Sachen und einige Casts, die Strings in Zahlen konvertieren.

Gruss Thomas

--
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
Marcel Müller
Guest





PostPosted: Mon Jun 20, 2005 8:15 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote

Hi,

Daniel Schüle schrieb:
Quote:
Hallo NG

std::string line = "0 [1] 2 8 12 32";

istringstream iss(line);
int a,b,c,d,e,f;
char c1,c2;
iss >> a >> c1 >> b >> c2 >> c >> d >> e >> f;


Marcel

--
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
Werner Salomon
Guest





PostPosted: Mon Jun 20, 2005 8:28 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote

Daniel Schüle wrote:
Quote:
Hallo NG

gibt es eine Möglichkeit bequem(ohne string zu parsen)
die Zahlen aus einem String auszuelesen.
zB

std::string line = "0 [1] 2 8 12 32";

die Lösung mit atoi(buffer), wo ich den buffer mit rausgeparsten
Zahlen fülle, funktioniert zwar, aber ich werde das Gefühl nicht los
dass es keine gute C++ Lösung ist.

MfG

Daniel

Hallo Daniel,


na ja - wenn die eckigen Klammern nicht wären, ginge es so:
// ---8<---
#include #include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>


int main() {
using namespace std;
std::string line = "0 1 2 8 12 32";
vector< int > v; // <- dort hinein
copy( istream_iterator< int >( stringstream( line ) ),
istream_iterator< int >(),
back_inserter( v ) );
return 0;
}
// ---8<---

ansonsten, wennn das oben mit '[1]' ernst gemeint ist, bastele man sich
z.B.: einen Manipulator

struct int_mit_klammern
{
explicit int_mit_klammern( int& target )
: m_target( target )
{}
friend
std::istream& operator>>( std::istream& in, int_mit_klammern& x )
{
char c, d;
if( in >> c && c == '['
&& in >> x.m_target >> d && d == ']' )
return in;
in.setstate( std::ios_base::failbit );
return in;
}
private:
int& m_target;
};

... und lese das Ganze so ein:
std::string line = "0 [1] 2 8 12 32";
vector< int > v(2);
stringstream buf( line );
buf >> v[0] >> int_mit_klammern( v[1] );
copy( istream_iterator< int >( buf ), istream_iterator< int >(),
back_inserter( v ) );

Gruß
Werner

--
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
Daniel Schüle
Guest





PostPosted: Mon Jun 20, 2005 11:38 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote

Quote:
std::string line = "0 [1] 2 8 12 32";

das Ganze ist für die Initialisierung eines Netzes gedacht
und in [] eingeschlossener Parameter, sollte
nur optisch eine bestimmte Eigenschaft des Nodes hervorheben.

die Möglichkeit mit

istringstream iss(line);
int a,b,c,d,e,f;
char c1,c2;
iss >> a >> c1 >> b >> c2 >> c >> d >> e >> f;

finde ich am einfachsten
werde mir noch genauer die Lösung von Werner anschauen.

Danke für eure Vorschläge
Gruss, Daniel

--
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
kanze@gabi-soft.fr
Guest





PostPosted: Tue Jun 21, 2005 8:20 am    Post subject: Re: zahlen aus dem string einlesen Reply with quote

Daniel Schüle wrote:
Quote:
std::string line = "0 [1] 2 8 12 32";

das Ganze ist für die Initialisierung eines Netzes gedacht und
in [] eingeschlossener Parameter, sollte nur optisch eine
bestimmte Eigenschaft des Nodes hervorheben.

die Möglichkeit mit

istringstream iss(line);
int a,b,c,d,e,f;
char c1,c2;
iss >> a >> c1 >> b >> c2 >> c >> d >> e >> f;

finde ich am einfachsten

Vorsicht aber. Wenn die Werten der Zahlen nicht irgenwie
beschränkt ist, kann es zu undefiniertes Behalten kommen. Diese
Lösung gilt eigentlich nur dann, wenn du kennst die
Implementierung, und weißt, dass sie sich richtig verhält, oder
wenn du vorher die Syntax überprüft hast (z.B. mit einem
regulären Ausdruck), und festgestellt hast, dass die Zahlen z.B.
höchst zwei or drei Ziffer enthalten.

(Ich glaube, dass die meisten Compiler halten sich richtig. In
jedem Fall ist dies der Fall für die drei Compiler, worauf ich
probieren kann: Sun CC, g++ und VC++. Vorher verifizieren aber
wäre sinnvoll.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
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
Werner Salomon
Guest





PostPosted: Tue Jun 21, 2005 7:26 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote

Daniel Schüle wrote:
Quote:
std::string line = "0 [1] 2 8 12 32";

das Ganze ist für die Initialisierung eines Netzes gedacht
und in [] eingeschlossener Parameter, sollte
nur optisch eine bestimmte Eigenschaft des Nodes hervorheben.

Hallo Daniel,

wenn alle Zahlen semantisch von gleicher Bedeutung sind (Nodes ?) und
der in eckigen Klammern nur eine bestimmte Eigenschaft beschreibt, so
kannst Du diesen 'kleinen Unterschied' beim Einlesen berücksichtigen.
Das kann man dann schon als Parsen bezeichnen. Etwa so:

// ---- 8< ----
#include #include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

class Node {
public:
friend
std::istream& operator>>( std::istream& in, Node& nd ) {
char c;
if( in >> c ) { // -- hier wird schon geparst
if( c == '[' ) {
// Ausdruck in []
if( in >> nd.m_id >> c && c != ']' )
in.setstate( std::ios_base::failbit );
else
nd.m_mark = true;
}
else {
in.putback( c );
if( in >> nd.m_id )
nd.m_mark = false;
}
}
return in;
}

friend std::ostream& operator<<( std::ostream& out,
const Node& nd ) {
return out << "> " << nd.m_id << (nd.m_mark? " <--": "");
}
private:
int m_id;
bool m_mark;
};

int main() {
using namespace std;
std::string line = "0 [1] 2 8 12 32";
vector< Node > v;
copy( istream_iterator< Node >( stringstream( line ) ),
istream_iterator< Node >(),
back_inserter( v ) );

// -- zur Kontrolle wieder ausgeben
copy( v.begin(), v.end(), ostream_iterator< Node >( cout, "n" ) );
cout << endl;
return 0;
}
// ---- 8< ----

Quote:
Danke für eure Vorschläge
Bitte

Gruß
Werner

--
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
Michael Bruschkewitz
Guest





PostPosted: Mon Jun 27, 2005 12:38 pm    Post subject: Re: zahlen aus dem string einlesen Reply with quote

Daniel Schüle schrieb:
Quote:
std::string line = "0 [1] 2 8 12 32";
das Ganze ist für die Initialisierung eines Netzes gedacht
und in [] eingeschlossener Parameter, sollte
nur optisch eine bestimmte Eigenschaft des Nodes hervorheben.


Hallo Daniel,
ich nehme an, alle Zahlen aus der Liste bezeichnen Nodes.
Warum schreibst Du nicht eine Klasse Node, und zu der Klasse einen
istream-operator?

class Node { ...
private:
setval(std::string const & s) {
// interpretiert s, also auch mit Klammern
// Hier auch die "besondere Eigenschaft" ausgewerten
}
friend istream & operator >> (istream & is, Node & n);
};
istream & operator >> (istream & is, Node & n)
{
std::string s; is >> s;
// Hier evtl. weiter Whitespaces innerhalb der Klammern beruecksichtigen
n.setval(s);
return is;
}

Du willst schliesslich keine Zahlen aus dem String lesen, sondern
Eigenschaften von Nodes, oder?

Viele Gruesse,
Michael B.

--
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.