 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Babak Pourat Guest
|
Posted: Fri Sep 03, 2004 11:48 am Post subject: printf <-> streams |
|
|
Hallo,
Ich habe folgendes Problem:
in dem Projekt das ich übernommen habe liegen die Fehlermeldungen als
char-Felder inclusive Formatierungszeichen für Printf in verschiedenen
Sprachen vor( Sie kommen eigentlich aus einer Datenbank ).
Sinngemäss:
#include <cstdio>
const char* GetFileErrorStr(char c){
switch(c){
case 'e':
return "File %s not found.n";
case 'd':
return "Datei %s nicht gefunden.n";
}
}
int main(){
std::printf(GetFileErrorStr('e'), "test.tst");
std::printf(GetFileErrorStr('d'), "test.tst");
return 0;
}
Wenn ich eine ähnliches mit iostreams implementiern will, muss ich die
Fehlermeldungen zerhacken oder nach irgendwelchen Sonderzeichen parsen wo
ich zusätzliche Werte einfüge oder ..., auf jeden Fall sehe ich ad hoc keine
so elegante Lösung wie mit printf und den Formatstrings.
Wie löst ihr solche Probleme?
Danke
Babak
--
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 Piefel Guest
|
Posted: Fri Sep 03, 2004 12:31 pm Post subject: Re: printf <-> streams |
|
|
Am Fri, 03 Sep 2004 13:48:49 +0200 schrieb Babak Pourat:
| Quote: | Wenn ich eine ähnliches mit iostreams implementiern will, muss ich die
Fehlermeldungen zerhacken oder nach irgendwelchen Sonderzeichen parsen wo
ich zusätzliche Werte einfüge oder ..., auf jeden Fall sehe ich ad hoc
keine so elegante Lösung wie mit printf und den Formatstrings.
|
a) Es spricht nicht so viel gegen printf(), wie immer wieder gerne
behauptet wird. Man sollte nicht nur aus Prinzip umstellen.
b) Für C++ gibt’s natürlich boost::format, das das gewünschte leistet.
Ciao,
Micha
--
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 |
|
 |
Falk Tannhäuser Guest
|
Posted: Fri Sep 03, 2004 12:53 pm Post subject: Re: printf <-> streams |
|
|
Babak Pourat wrote:
| Quote: |
#include <cstdio
const char* GetFileErrorStr(char c){
switch(c){
case 'e':
return "File %s not found.n";
case 'd':
return "Datei %s nicht gefunden.n";
}
}
int main(){
std::printf(GetFileErrorStr('e'), "test.tst");
std::printf(GetFileErrorStr('d'), "test.tst");
return 0;
}
Wenn ich eine ähnliches mit iostreams implementiern will, muss ich die
Fehlermeldungen zerhacken oder nach irgendwelchen Sonderzeichen parsen wo
ich zusätzliche Werte einfüge oder ..., auf jeden Fall sehe ich ad hoc keine
so elegante Lösung wie mit printf und den Formatstrings.
|
Sieht aus, als ob boost::format
für dich gemacht wäre! Das scheint mir die Vorteile von printf mit denen der
iostreams (Erweiterbarkeit auf benutzerdefinierte Typen, Typsicherheit) zu
vereinen; und es lässt sich meines Wissens sogar der Fall behandeln,
dass der Satzbau und damit möglicherweise die Reihenfolge der auszugebenden
Felder von Sprache zu Sprache variiert.
Disclaimer: Habe noch nicht die Gelegenheit gehabt, das ganze selbst zu
benutzen und zu testen.
MfG
Falk
--
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
|
Posted: Thu Sep 09, 2004 9:49 am Post subject: Re: printf <-> streams |
|
|
"Babak Pourat" <pourat (AT) autronic (DOT) melchers.de> wrote
| Quote: | in dem Projekt das ich übernommen habe liegen die Fehlermeldungen als
char-Felder inclusive Formatierungszeichen für Printf in verschiedenen
Sprachen vor( Sie kommen eigentlich aus einer Datenbank ).
|
Das ist ehe gewöhnlich. In Open Systems ist printf sogar erweitert,
damit die Parameter nicht unbedingt in derselben Reihenfolge vorkommen
müssen.
| Quote: | Sinngemäss:
#include
const char* GetFileErrorStr(char c){
switch(c){
case 'e':
return "File %s not found.n";
case 'd':
return "Datei %s nicht gefunden.n";
}
}
int main(){
std::printf(GetFileErrorStr('e'), "test.tst");
std::printf(GetFileErrorStr('d'), "test.tst");
return 0;
}
Wenn ich eine ähnliches mit iostreams implementiern will, muss ich die
Fehlermeldungen zerhacken oder nach irgendwelchen Sonderzeichen parsen
wo ich zusätzliche Werte einfüge oder ..., auf jeden Fall sehe ich ad
hoc keine so elegante Lösung wie mit printf und den Formatstrings.
|
In der Tat. Es gibt aber mindestens zwei Implementierungen, die schon
zur Verfügung stehen:
- Bei mir gibt es GB_Format, der 100% Kompatable mit dem printf von
Open Systems ist. Wie printf unterstutzt er aber kein wchar_t.
Dagegen ist er auch kein Template, und lässt sich mit fast allen
gängigen Compiler compilieren.
- Bei Boost gibt es auch eine Klasse format, die in vielen Hinweisen
meine ähnlich ist. Es gibt zwar einige Formattierungsoptionen, die
sie nicht unterstützt, aber die sind auch nicht unbedingt so
interessant -- alles wichtiges ist wohl da. Leiter überlädt sie den
Operator % in einer Art, die die Lesbarkeit des Codes mindert. Aber
der bedeuteste Unterschied ist, dass sie ein Template ist, der auch
mit wchar_t funktionniert. Und aber deshalb sich nicht mit z.B. Sun
CC (dem von mir meist benutzten Compiler) compilieren lässt.
--
James Kanze GABI Software http://www.gabi-soft.fr
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 |
|
 |
|
|
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
|
|