printf - Benutzerdefinierte Füllzeichen
-
Das ist es ja gerade: Du kennst die Möglichkeiten von cout gar nicht:
http://www.cplusplus.com/reference/iostream/manipulators/setfill/
http://www.cplusplus.com/reference/iostream/manipulators/setw/Oder allgemein:
http://www.cplusplus.com/reference/iostream/manipulators/
-
char fuellzeichen[81]; memset(fuellzeichen, '-', sizeof(fuellzeichen)); fuellzeichen[sizeof(fuellzeichen)-1] = 0; printf(fuellzeichen);aber gut ist das nicht.
-
SeppJ schrieb:
Das ist es ja gerade: Du kennst die Möglichkeiten von cout gar nicht
Deswegen stell ich ja hier die Frage - "setfill" ist genau das was ich gesucht habe.
Besten Dank für euere Hilfe.
-
DaRpH schrieb:
char fuellzeichen[81]; memset(fuellzeichen, '-', sizeof(fuellzeichen)); fuellzeichen[sizeof(fuellzeichen)-1] = 0; printf(fuellzeichen);aber gut ist das nicht.
Um ehrlich zu sein ist das eine Katastrophe

-
cout hat den Nachteil das es sehr langsam gegenüber von printf ist. Das ist eigentlich der einzigste Grund der mir einfällt es nicht zu nehmen.
-
Matyr schrieb:
cout hat den Nachteil das es sehr langsam gegenüber von printf ist. Das ist eigentlich der einzigste Grund der mir einfällt es nicht zu nehmen.
Tja, nur ist das nicht wahr. Wenn man
std::coutrichtig verwendet, dann ist der Geschwindigkeitsunterschied zuprintfminimal. Allerdings ist die Geschwindigkeit sowieso meistens kein Thema.Wichtig ist folgendes:
int main() { int const cout_buffer_size = 512; char cout_buffer[cout_buffer_size]; std::cout.rdbuf()->pubsetbuf(cout_buffer, cout_buffer_size); }Damit legt man einen Puffer fest. Unter MSVC ist normalerweise keiner Vorhanden im Gegensatz zu
printf, weshalbprintffälschlicherweise oft als deutlich schneller angesehen wird.
Es gibt aber auch noch andere Dinge zu beachten. Zum Beispiel auch nicht immerstd::endlfür eine neue Linie verwenden, usw.Grüssli
-
Tja, nur ist das nicht wahr. Wenn man std::cout richtig verwendet, dann ist >der Geschwindigkeitsunterschied zu printf minimal. Allerdings ist die >Geschwindigkeit sowieso meistens kein Thema.
Das ist Falsch.
cout ist ja nur eine Ableitung der stream Klassen und beim Filestream macht das durchaus ein unterschied.
Ich hatte Gestern den Fall das ich ein wenig meine XML Ausgabe Optimiert habe.
Als Messung wird 10x eine 38MByte große XML geschrieben.
In diese wird Häufig ein int wert als Attribut ausgegeben.
So etwa.out << pName << "=\"" << IntVert << '\"';Dieses habe ich dann feinsäuberlich, per hand (Ja Char Pointer %-), in einen char Buffer geschrieben (auch den int wert) und dann als ganzes dem Stream Übergeben.
Dadurch wurde meine Messung von 20 Sekunden auf 16 Sekunden Reduziert. Also schon einiges.
An einigen anderen stellen brachte ein sprintf in einen buffer und dann erst komplett an den stream Übergeben, auch eine messbare änderung.
Nur mal so als Anregung.
Lichtlein
-
@Lichtlein,
std::coutist keine Ableitung der Streamklassen. Es ist einstd::ostreamObjekt.printfundstd::coutsind Konsolenausgaben. Das ist ja wohl etwas anderes als eine File-Ausgabe! Und eine Konsolenausgabe muss ja normalerweise wirklich nicht so schnell laufen. Schliesslich möchte vielleicht jemand diese Ausgabe lesen
Grüssli
-
In Linux benutzen viele Konsolen Programme die Standard Ausgabe um die Daten auszugeben damit man diese über eine Pipe in ein anderes Programm per Standard Eingabe empfangen kann. Da macht es durchaus Sinn schnell zu Sein. :p
Ich hatte mal eine Liste gefunden wo sich jemand die Mühe gemacht hat und die Laufzeit Unterschiede zwischen (s)printf und ostream gemessen. Da war ich dann ein wenig Entäuscht von C++. Teilweise 2,5x langsamer. Das wollte ich eigentlich herausstreichen.
Lichtlein
-
Wenn es unbedingt so schnell sein muss, nimm halt printf().
Die IOStreams Bibliothek bietet noch viel mehr als nur cout und dass das alles nicht kostenlos ist, sollte eigentlich jedem klar sein.
-
Lichtlein schrieb:
In Linux benutzen viele Konsolen Programme die Standard Ausgabe um die Daten auszugeben damit man diese über eine Pipe in ein anderes Programm per Standard Eingabe empfangen kann. Da macht es durchaus Sinn schnell zu Sein. :p
Nein, tut es nicht. Wenn man auf der Konsole arbeitet, dann nimmt man in Kauf, dass es nicht gerade die schnellste Verarbeitung ist. Dafür ist der Weg vielleicht praktisch. Wenn man wirklich Geschwindigkeit bei der Verarbeitung möchte, würde man das Problem nicht über die Konsole lösen.
Lichtlein schrieb:
Ich hatte mal eine Liste gefunden wo sich jemand die Mühe gemacht hat und die Laufzeit Unterschiede zwischen (s)printf und ostream gemessen. Da war ich dann ein wenig Entäuscht von C++. Teilweise 2,5x langsamer. Das wollte ich eigentlich herausstreichen.
Diese Vergleiche sind oftmals ziemlich unfair gemacht. Zum Beispiel wird eben in
printfein Puffer verwendet und bei den IOStreams nicht. Ich würde diesen Messungen nicht viel Glauben schenken. Es sind auch vielfach reine Trockenübungen. Und schlussendlich ist es halt wirklich auch noch so, wie "IOStreams" es gesagt hat.std::coutkann ein bisschen mehr als einprintf.Grüssli
-
@IOStreams
@Dravere
Ich komme eigentlich aus der System Ecke, dort wo C++ noch als Hexenwerk bezeichnet wird und "Nur Echte Männer Arbeiten" (Zitat Kollege). Java und #C, was issen das, kann man das Essen?
Mir ist durchaus bewußt das die IoStreams sehr mächtige Werkzeuge sind. Ich sehe aber auch das diese Beqeumlichkeit gepaart mit den Häutigen GHz Prozessoren schnell dazu führen kann, unnötigen langsamen Code zu schreiben.
Es ist nun mal so, das
[cpp}
cout << ">" << mName << "," << mNachname << ": " << mPLZ << endl;
[/cpp]
7 mal einen Call in den ostream ausführt, das 7 mal der ostream seine Umgebungparameter prüfen muss usw.Wohingegen
printf(">%s,%s: %u\n", mName, mNachname, mPLZ);nur 1 mal aufgerufen wird, und somit auch nur 1 mal seine Umgebungsparameter prüfen muss.
Ich glaube ich werde mich in Zukunft bei solchen Themen ein wenig zurück nehmen. Ist wohl nicht sehr förderlich wenn hier Grundlegende Sachen gefragt werden und man gleich eines mit der Performenc Keule übergebraten bekommt.

Paradoxes am Rande, als Hobby mache ich gerade eine kleine reine GUI Applikation. Ich muss mich da teilweise zwingen den Speicher- und Rechenzeit-verbrauch zu Ignorieren um weiter zu kommen. Da Taugt das eben nicht, wenn man noch in Bits und Bytes Denkt und us die Zeiteinheit der Wahl ist.

Lichtlein
-
Lichtlein schrieb:
Mir ist durchaus bewußt das die IoStreams sehr mächtige Werkzeuge sind. Ich sehe aber auch das diese Beqeumlichkeit gepaart mit den Häutigen GHz Prozessoren schnell dazu führen kann, unnötigen langsamen Code zu schreiben.
Was aber meistens im Vergleich zu anderen Stellen im Code vernachlässigt werden kann. Es bringt dir nichts, wenn du auf alle Bequemlichkeiten verzichtest, unwartbaren Code produziert und dafür das letzte rausgeholst hast. Wobei das nicht mal stimmen muss, erst ein Profiler kann da wirklich genaueres sagen.
Lichtlein schrieb:
Es ist nun mal so, das
cout << ">" << mName << "," << mNachname << ": " << mPLZ << endl;7 mal einen Call in den ostream ausführt, das 7 mal der ostream seine Umgebungparameter prüfen muss usw.
Wohingegen
printf(">%s,%s: %u\n", mName, mNachname, mPLZ);nur 1 mal aufgerufen wird, und somit auch nur 1 mal seine Umgebungsparameter prüfen muss.
Das sind genau so oberflächliche und unfaire Aussagen. Was meinst du, was
printfdann macht? Zaubert es einfach so mal die fehlenden Angaben in den String rein? Wahrscheinlich finden intern diese 7 Aufrufe genau gleich statt, wobei jedesmal auf Fehler geprüft werden muss. So kann man eben keine Vergleiche durchführen.Grüssli