printf in C++?
-
Oder suchst du so was:
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/c++_zahlenformatierung_deMfG f.-th.
-
PS: In boost gibt es übrigens ein Helferlein, das Formatstrings mit Streams vereint. Und das Ganze ist dann sogar typsicher.
-
Alles, was du von C kennst, kannst du in C++ auch einsetzen.
Aber gerade die leichtere Handhabung von streams als printf und co überzeugen schnell jeden Umsteiger von C nach C++ und wecken Lust auf mehr! :p
-
Es gibt aber einige Toolkits die den bequemen Umgang von printf mit der Sicherheit von Streams verbinden. Zum Beispiel bei Qt die .arg-Funktionen von QString oder dessen printf-Implementierungen.
-
Das mit Qt hört sich gut ich hatte eh vor das Framework zu nutzen, habe da nur gutes drüber gelesen und man kann ja jetzt wohl auch properetäre Software mit entwicklen ohne eine Linzenz kaufen zu müssen. Die IDE von denen is auch der Hammer bis jetzt, so einfach kann coden sein.
Ich liebe nunmal Formatstrings es gibt nix was übersichtlicher ist.
-
Busterman schrieb:
Ich liebe nunmal Formatstrings es gibt nix was übersichtlicher ist.
Doch, die Streams.
Spätestens bei verschiedensten eigenen Typen sind Formatstrings unbrauchbar.
-
Was willsten denn ausgeben ausser Grunddatentypen oder Zeichenketten?
printf könnte doch in C++ auch so aussehen das man gar keinen Typ so wie in C angibt sondern einfach nur Platzhalter einsetzt und dann das printf die richtig umwandlung überlässt?Nenn mal bitte ein Beispiel warum dieses dann nicht gut sein sollte?
Als Beispiel nochmal:
cout << "Der Wert " << wert << " kann von dem anderen Wert " << awert << " zu " << prozent << "% abweichen" endl; printf_cpp("Der Wert %0 kann von dem anderen Wert %1 zu %2%% abweichen", wert, awert, prozent);
So was is da bitte übersichtlicher?
-
Busterman schrieb:
...
std::complex<double> c(1,1); std::[hier kann jeder stream-typ stehen] << c << '\n'; printf("%??\n", c); //welches Format?
-
Busterman schrieb:
Was willsten denn ausgeben ausser Grunddatentypen oder Zeichenketten?
Die Custom Types können einfach den Streaming Operator überladen und alles mögliche in den Stream schreiben. So daß du nicht mehr zB bei Kundendaten händisch Namen etc. ausgeben musst, sondern einfach:
std::cout << kunde1 << '\n' << kunde2 << std::endl;
-
Busterman schrieb:
Was willsten denn ausgeben ausser Grunddatentypen oder Zeichenketten?
Eigene Typen, um sie beispielsweise in Dateien zu speichern.
Busterman schrieb:
cout << "Der Wert " << wert << " kann von dem anderen Wert " << awert << " zu " << prozent << "% abweichen" endl; printf_cpp("Der Wert %0 kann von dem anderen Wert %1 zu %2%% abweichen", wert, awert, prozent);
So was is da bitte übersichtlicher?
In diesem Fall vielleicht das zweite. Und jetzt füge mal Modifier dazu, z.B. ein Endline das gleich den Buffer flusht, oder das auffüllen mit Zeichen, wenn der Wert nicht lang genug ist, oder das definieren der Genauigkeit von Fließkommazahlen.
-
Janjan schrieb:
oder das auffüllen mit Zeichen, wenn der Wert nicht lang genug ist, oder das definieren der Genauigkeit von Fließkommazahlen.
QString("Der Wert %1 kann von dem anderen Wert %2 zu %3%% abweichen", "Abweichungshinweis") .arg(wert, 3, 'f', 2) .arg(awert, 3, 'f', 2) .arg(prozent, 3, 'f', 2);
Großer Vorteil hierbei ist das dieser String SEHR leicht noch durch den Linguist (Übersetzungstool von Qt) laufen kann und von diesem als ein String erkannt wird. Die Zerstückelung die man bei Streams hat, verhindert meist jede komfortable Internationalisierung.
-
Hmm ok, das wird schwierig.
Gut dann anders herrum, warum gibt es nicht beide Möglichkeiten einmal das cout für spezielle Anforderungen und einmal einen sicheren printf wie ich ihn beschrieben haben?
-
Fellhuhn schrieb:
Großer Vorteil hierbei ist das dieser String SEHR leicht noch durch den Linguist (Übersetzungstool von Qt) laufen kann und von diesem als ein String erkannt wird. Die Zerstückelung die man bei Streams hat, verhindert meist jede komfortable Internationalisierung.
Wieso das? Du kannst über Facetten sehr fein steuern, was wie internationalisiert werden soll. Ohne sich an Qt zu binden.
-
@Fellhuhn: ja genau sowas habe ich gesucht wunderbar, warum nehmen die qt nicht in der standard auf, dann wäre c++ eine geile sprache mit geilem framework...
-
Tachyon schrieb:
Wieso das? Du kannst über Facetten sehr fein steuern, was wie internationalisiert werden soll. Ohne sich an Qt zu binden.
Wie?
Wenn du folgendes hast:
cout << "Der Wert " << wert << " kann von dem anderen Wert " << awert << " zu " << prozent << "% abweichen" endl;
Sind das 4 Strings die übersetzt werden müssen. Klar kannst du diese durch die jeweilige Sprachenrepräsentation ersetzen, allerdings bist du dann an die Reihenfolge von String und Wert gebunden und kannst hier nichts tauschen.
EDIT:
Denn ob QString("%1 ist größer %2").arg(10).arg(5) oder QString("%2 ist kleiner als %1").arg(10).arg(5) ist egal. Nur der String hat sich geändert (sagen wir dank Internationalisierung, auch wenn dieses Beispiel nicht gerade Sinn macht) und du hast keine einzige extra Zeile Code.
Ob dies nun dank Qt geschieh oder durch eine eigene Implementierung ist egal, mächtiger als Streams ist es auf jeden Fall.
-
@Fellhuhn: Daran habe ich noch gar nicht gedacht, klar mir cout geht jeder Internationalisierung den Bach runter. Keine Trennung von Code und Content das ist ganz übles Design...
-
Fellhuhn schrieb:
...
Okay, was das betrifft hast Du recht. Aber da würde ich eher zu boost::format greifen, glaube ich.
Qt finde ich an vielen stellen ziemlich grausam. Vor allem bei Dingen, die MOC erzeugt. Außerdem bindet man sich dabei ziemlich viele Bibliotheken an den Hals.
-
Tachyon schrieb:
Fellhuhn schrieb:
...
Okay, was das betrifft hast Du recht. Aber da würde ich eher zu boost::format greifen, glaube ich.
Qt finde ich an vielen stellen ziemlich grausam. Vor allem bei Dingen, die MOC erzeugt. Außerdem bindet man sich dabei ziemlich viele Bibliotheken an den Hals.Das ist richtig. Hat die alte Qt-Krake einmal Wurzeln geschlagen bekommt man die nur schwer wieder raus. Und wehe man hält sich nicht an die kryptischen Compile-Vorgänge... Auch wenn es sehr komfortabel ist. Aber man kann sich dort auch viel abschauen, weil da echt viele gute Ideen drinstecken.
Wobei ich bei Konsolenanwendungen und kleinen Programmen natürlich auch mit Streams arbeite. Wenn man aber eh eine Qt-Applikation schreibt, spricht ja nichts dagegen auch die Qt-Möglichkeiten zu nutzen.
-
Code::Blocks?
Eclipse?
-
Busterman schrieb:
...
ich hab die QT-Creator-Diskussion mal ausgelagert:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-267677.html