 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
news.arcor.de Guest
|
Posted: Tue May 08, 2007 5:48 pm Post subject: std::string, zahlen, stringstream, etc.. |
|
|
Hallo!
Weil ich bisher immer ganz brauchbare Workarounds gefunden habe habe ich
mich bis heute nicht um DIE Loesung gekuemmert, nun wurmt es mich aber
doch. Meine Frage wurde bisher vermutlich schon haeufig gestellt,
versuche ich aber danach zu suchen finden sich mannigfaltige Antworten
aber eben nicht genau das, was ich suche.
Problem: wie gehe ich vernuenftig mit Zahlen und Strings um?
Ich moechte _beispielsweise_ in einem String Eigenschaften wie Position
und Farbe kodieren.
frueher waere irgendwas mit sprintf bei rausgekommen
sprintf( buffer, "C .3%f .3%f .3%f P .3%f .3%f .3%f", ... );
das ist aber natuerlich unsicher, haesslich, unflexibel, alt,
deprecated, etc..
Auf solche Fragen findet man meistens irgendwelche Antworten mit
streams, um die ich bisher fleissig Umwege gemacht habe. Im vorliegenden
Fall aus folgenden Gruenden:
- ich muss einen stringstream verwenden um ihn dann in einen string zu
verwandeln?
- wie formatiere ich verlustarm und intuitiv die Zahlen?
Bei std::string habe ich dagegen das Problem, dass Zahlen beim Design
gar keine Rolle gespielt haben.
Unabhaengig vom Gesagten - wie sieht denn eine Funktion prinzipiell aus,
die etwa folgendes macht:
std::string my_matrix::to_string( void ){
std::string l_return;
for( size_t m = 0; n < dimension; n++ ){
for( size_t n = 0; n < dimension; n++ ){
l_return += value[ n ][ m ] + " ";
}
l_return += "|";
}
return l_return;
}
Natuerlich koennte ich den operator += (std::string, class T)
implementieren. Oder ich schreibe eine Funktion
format("formatstring", value). Oder ich verwende einen stringstream und
konvertiere ihn anschliessend in einen string.
Aber was ist die anzustrebende Loesung?
Fuer Tipps, Links, Stichwoerter, etc. vielen Dank im Voraus,
Frans |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu May 10, 2007 1:35 am Post subject: Re: std::string, zahlen, stringstream, etc.. |
|
|
news.arcor.de wrote:
| Quote: | Hallo!
Weil ich bisher immer ganz brauchbare Workarounds gefunden habe habe ich
mich bis heute nicht um DIE Loesung gekuemmert, nun wurmt es mich aber
doch. Meine Frage wurde bisher vermutlich schon haeufig gestellt,
versuche ich aber danach zu suchen finden sich mannigfaltige Antworten
aber eben nicht genau das, was ich suche.
Problem: wie gehe ich vernuenftig mit Zahlen und Strings um?
Ich moechte _beispielsweise_ in einem String Eigenschaften wie Position
und Farbe kodieren.
frueher waere irgendwas mit sprintf bei rausgekommen
sprintf( buffer, "C .3%f .3%f .3%f P .3%f .3%f .3%f", ... );
das ist aber natuerlich unsicher, haesslich, unflexibel, alt,
deprecated, etc..
Auf solche Fragen findet man meistens irgendwelche Antworten mit
streams, um die ich bisher fleissig Umwege gemacht habe. Im vorliegenden
Fall aus folgenden Gruenden:
- ich muss einen stringstream verwenden um ihn dann in einen string zu
verwandeln?
|
Der Stringstream schreibt seine Daten in einen String. Diesen kannst du dann
nachher rausholen. Im Prinzip also so ähnlich wie bei sprintf, nur daß du
dir um die Größe des Strings keine Sorgen machen mußt.
| Quote: | - wie formatiere ich verlustarm und intuitiv die Zahlen?
|
Genauso wie bei cout.
| Quote: | Bei std::string habe ich dagegen das Problem, dass Zahlen beim Design
gar keine Rolle gespielt haben.
Unabhaengig vom Gesagten - wie sieht denn eine Funktion prinzipiell aus,
die etwa folgendes macht:
std::string my_matrix::to_string( void ){
std::string l_return;
for( size_t m = 0; n < dimension; n++ ){
for( size_t n = 0; n < dimension; n++ ){
l_return += value[ n ][ m ] + " ";
}
l_return += "|";
}
return l_return;
}
Natuerlich koennte ich den operator += (std::string, class T)
implementieren. Oder ich schreibe eine Funktion
format("formatstring", value). Oder ich verwende einen stringstream und
konvertiere ihn anschliessend in einen string.
Aber was ist die anzustrebende Loesung?
|
Ich würde einen operator<<(std::ostream&, const my_matrix&) machen. Damit
kannst du es dann in einen beliebigen C++-Stream schreiben, egal ob cout
oder eine Datei oder ein String. |
|
| Back to top |
|
 |
Babak Pourat Guest
|
Posted: Thu May 10, 2007 11:54 am Post subject: Re: std::string, zahlen, stringstream, etc.. |
|
|
news.arcor.de schrieb:
wer?
| Quote: | Problem: wie gehe ich vernuenftig mit Zahlen und Strings um?
Fuer Tipps, Links, Stichwoerter, etc. vielen Dank im Voraus,
|
1) boost::lexical_cast (http://www.boost.org)
2) http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1
Grüsse
Babak |
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
Posted: Thu May 10, 2007 12:36 pm Post subject: Re: std::string, zahlen, stringstream, etc.. |
|
|
news.arcor.de wrote:
| Quote: | Problem: wie gehe ich vernuenftig mit Zahlen und Strings um?
Ich moechte _beispielsweise_ in einem String Eigenschaften wie Position
und Farbe kodieren.
frueher waere irgendwas mit sprintf bei rausgekommen
sprintf( buffer, "C .3%f .3%f .3%f P .3%f .3%f .3%f", ... );
|
Farbe wäre mir neu, ist das Standard C++?
| Quote: | das ist aber natuerlich unsicher, haesslich, unflexibel, alt,
deprecated, etc..
|
Aber schneller als ostringstream, falls die Performance wichtig ist
(ich wollte es nur gesagt haben).
| Quote: | Auf solche Fragen findet man meistens irgendwelche Antworten mit
streams, um die ich bisher fleissig Umwege gemacht habe. Im vorliegenden
Fall aus folgenden Gruenden:
- ich muss einen stringstream verwenden um ihn dann in einen string zu
verwandeln?
|
Das, oder den Umweg über snprintf() auf einen lokales char-array, das
zum in einen string gesteckt wird.
| Quote: | - wie formatiere ich verlustarm und intuitiv die Zahlen?
|
Intuitiv ist eine Frage der Gewohnheit. Wer immer nur printf() verwendet hat,
dem ist iostream ein Buch mit sieben Siegeln, umgekehrt aber auch. Für
Beratungsresistente und Umsteigeunwillige habe ich eine iostream Manipulator[1]
gebastelt, der einen printf() Formatstring frisst, und eine printf() kompatible
Funktion[2], die einen std::string zurückliefert
| Quote: | Unabhaengig vom Gesagten - wie sieht denn eine Funktion prinzipiell aus,
die etwa folgendes macht:
std::string my_matrix::to_string( void ){
std::string l_return;
for( size_t m = 0; n < dimension; n++ ){
for( size_t n = 0; n < dimension; n++ ){
l_return += value[ n ][ m ] + " ";
}
l_return += "|";
}
return l_return;
}
Natuerlich koennte ich den operator += (std::string, class T)
implementieren.
|
Das ist eine elegante Methode, obwohl ich wegen besserer Orthogonalität
to_string() bevorzuge. Zumindest sollte man den operator<< nicht als
Memberfunktion schreiben, damit die Matrixklasse nicht zu sehr mit den
stream-Klassen verheiratet wird.
| Quote: | Oder ich schreibe eine Funktion
format("formatstring", value). Oder ich verwende einen stringstream und
konvertiere ihn anschliessend in einen string.
Aber was ist die anzustrebende Loesung?
|
Das hängt von zu vielen Parametern ab. Spielt Performance eine
Rolle, fällt ostringstream aus. Müssen andere Programmierer den Code
warten, die sich mit iostream nicht auskennen, dann besser nur
sparsam verwenden.
[1] //www.huennebeck-online.de/software/download/src/index.html
-> I/O Library, Klasse CFormat.
[2] //www.huennebeck-online.de/software/download/src/index.html
-> STL Library, Funktion STLStringPrintf().
Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc |
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Thu May 10, 2007 12:40 pm Post subject: Re: std::string, zahlen, stringstream, etc.. |
|
|
news.arcor.de wrote:
| Quote: | Hallo!
[snip]
Problem: wie gehe ich vernuenftig mit Zahlen und Strings um?
[snip]
Aber was ist die anzustrebende Loesung?
Fuer Tipps, Links, Stichwoerter, etc. vielen Dank im Voraus,
|
Ebenfalls Hallo,
die anzustrebende Lösung ist etwas wie boost::format. boost::format
ist aus folgenden Gründen gut:
- Formatstrings lassen sich gut übersetzen, weil dann die finale
Zeichenkette nicht aus mehreren Zusammengesetzt wird wie bei
cout << "Hallo "+name << endl;
- boost::format lässt die Formatierungsvariablen frei positionieren,
was für Übersetzbarkeit eigentlich unerlässlich ist, von den meisten
Formatstring-Implementationen allerdings komplett ignoriert wird.
Was würde man sonst tun, wenn man "Hallo "+name in eine Sprache
übersetzen müsste, wo der Name in der Begrüßung zuerst kommt?
- Bietet die "einfacheren" Formatierungen von Werten gegenüber streams,
wo man mit setprecision und co. doch sehr viel zu tippen hat.
Das Projekt findest du hier:
http://www.boost.org/libs/format/index.html
MfG,
Daniel
P.S.: Ein Realname ist hier immer gerne gesehen. |
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Thu May 10, 2007 11:53 pm Post subject: Re: std::string, zahlen, stringstream, etc.. |
|
|
Hi news.arcor.de,
| Quote: | - ich muss einen stringstream verwenden um ihn dann in einen string zu
verwandeln?
Auch einen mit snprintf gefüllten buffer kannst Du in einen std:string |
verwandeln.
| Quote: | - wie formatiere ich verlustarm und intuitiv die Zahlen?
Kommt drauf an... |
| Quote: | Natuerlich koennte ich den operator += (std::string, class T)
implementieren.
Keine gute Idee. Nicht intuitiv und der Anwender kann keine |
Formatierungen von außen angeben.
| Quote: | Oder ich schreibe eine Funktion
format("formatstring", value).
Gibt es schon: boost::format |
| Quote: | Oder ich verwende einen stringstream und
konvertiere ihn anschliessend in einen string.
Nicht die schlechteste - da schnellste - Lösung (von mal snprintf |
abgesehen). Sowohl boost::format als auch boost::lexical_cast verwenden
intern auch nur Streams.
| Quote: | Unabhaengig vom Gesagten - wie sieht denn eine Funktion prinzipiell aus,
die etwa folgendes macht:
std::string my_matrix::to_string( void ){
std::string l_return;
for( size_t m = 0; n < dimension; n++ ){
for( size_t n = 0; n < dimension; n++ ){
l_return += value[ n ][ m ] + " ";
}
l_return += "|";
}
return l_return;
}
|
Wenn Du Dich an boost:format versuchen willst, dann bitte in etwa so:
std::string my_matrix::to_string( void )
{
boost::format formater("%.3f ");
std::string l_return;
for( size_t m = 0; n < dimension; n++ ){
for( size_t n = 0; n < dimension; n++ ){
l_return += (formater % value[ n ][ m ]).str();
}
l_return += "|";
}
return l_return;
}
Damit wird der Formatstring nicht jedesmal innerhalb der Schleife neu
geparst.
MfG
Olaf Krzikalla |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Fri May 11, 2007 6:11 pm Post subject: Re: std::string, zahlen, stringstream, etc.. |
|
|
On May 8, 2:48 pm, "news.arcor.de" <sendspamher...@arcor.de> wrote:
| Quote: | Weil ich bisher immer ganz brauchbare Workarounds gefunden habe habe ich
mich bis heute nicht um DIE Loesung gekuemmert, nun wurmt es mich aber
doch. Meine Frage wurde bisher vermutlich schon haeufig gestellt,
versuche ich aber danach zu suchen finden sich mannigfaltige Antworten
aber eben nicht genau das, was ich suche.
Problem: wie gehe ich vernuenftig mit Zahlen und Strings um?
Ich moechte _beispielsweise_ in einem String Eigenschaften wie Position
und Farbe kodieren.
frueher waere irgendwas mit sprintf bei rausgekommen
sprintf( buffer, "C .3%f .3%f .3%f P .3%f .3%f .3%f", ... );
das ist aber natuerlich unsicher, haesslich, unflexibel, alt,
deprecated, etc..
|
Auch, es geht davon, dass der Benutzer weiß, was in Farbe und
Position stecken. Viel sinnvoller wäre:
std::ostringstream dest ;
dest << "C " << farbe << " P " << position ;
Dann muss man freilich die << Operatore für Farbe und Position
implementieren, aber das scheint mir allgemein interessant; dann
kann man sie auch getrennt benutzen (also, nur eine Farbe oder
eine Stelle ausgeben, die eine ohne die andere).
Eine einfache Implementierung für Farbe wäre vielleicht:
std::ostream&
operator<<( std::ostream& dest, Farbe const& obj )
{
IOSave save( dest ) ;
dest.precision( 3 ) ;
dest.setf( std::ios::fixed, std::ios::floatfield ) ;
dest << obj.first() << ' ' << obj.second() << ' ' <<
obj.third ;
return dest ;
}
(Ich benutze da die IOSave-Klasse aus der Gabi-Bibliothek,
http://kanze.james.neuf.fr/codebase-de.html. Es ist aber recht
leicht, sie selber zu implementieren.)
Eine vollständigere Version könnte auch seine eigene
Manipulatore definieren, um unterschiedene Formate zu
unterstützen.
| Quote: | Auf solche Fragen findet man meistens irgendwelche Antworten mit
streams, um die ich bisher fleissig Umwege gemacht habe. Im vorliegenden
Fall aus folgenden Gruenden:
- ich muss einen stringstream verwenden um ihn dann in einen string zu
verwandeln?
|
Wenn du eine std::string haben will, ist das wahrscheinlich die
beste Lösung. Für andere Zwecke aber benutze ich häufig noch
ostrstream, um direkt in einen Puffer zu formattieren.
| Quote: | - wie formatiere ich verlustarm und intuitiv die Zahlen?
|
Das musst du doch wissen:-). Typischerweise aber werden mehrere
Formate verlangt, je nach der Benutzung.
| Quote: | Bei std::string habe ich dagegen das Problem, dass Zahlen beim Design
gar keine Rolle gespielt haben.
|
Normall, aber? std::string ist für Text gedacht.
| Quote: | Unabhaengig vom Gesagten - wie sieht denn eine Funktion prinzipiell aus,
die etwa folgendes macht:
std::string my_matrix::to_string( void ){
std::string l_return;
for( size_t m = 0; n < dimension; n++ ){
for( size_t n = 0; n < dimension; n++ ){
l_return += value[ n ][ m ] + " ";
}
l_return += "|";
}
return l_return;
}
|
Kommt darauf an, was im my_matrix enthalten ist. Eine to_string
Funktion ist häufig eine gute Idee; wird aber meistens mittels
std::ostringstream implementiert.
| Quote: | Natuerlich koennte ich den operator += (std::string, class T)
implementieren.
|
Wenn T Text darstellt ist das wahrscheinlich OK. Wenn nicht,
ehe verwirrend.
| Quote: | Oder ich schreibe eine Funktion format("formatstring", value).
Oder ich verwende einen stringstream und konvertiere ihn
anschliessend in einen string.
|
Am besten fängst du mit einem operator<<( std::ostream&, ... )
und einem operator>>( std::istream, ... ) an.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
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 |
|
| 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
|
|