printf() "schneller" als cout<<?
-
Hi,
kann mir mal einer erklären, warum bei folgendem Code in der Konsole die printf() -ausgabe eher erscheint als die cout<< -ausgabe ??? mir ist klar, dass man sich auf eins einigen sollte (am besten wohl cout, denke ich mal), aber mich interessiert trotzdem mal.
#include <iostream.h> #include <stdio.h> char abc[]=":op"; void main() { cout<<"Moin!"; printf("Höhö %s \n", abc); }
Achja, ich nutze MS Visual C++ 6.0
Viele Grüße!
-
würd mal sagn cout is aus der klasse iostream...da wird glaub ich eine instanz erstellt...das dauert halt...u dann daten übergeben
u printf is is ja eine funktion aus stdio.... <--- c header... die is ja ohne klassen aufgebaut...
cu
-
mach ein '<< endl' hinter dein 'cout', dann kommt's in der richtigen reihenfolge.
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
-
killer schrieb:
da wird glaub ich eine instanz erstellt...das dauert halt...u dann daten übergeben
nee, da läuft ja nichts asynchrones ab, auch wenn eine instanz erstellt werden würde, wäre es komplettt fertig bis zum 'printf' aufruf.
-
Weil die Ausgaben in unterschiedlichen Buffer zwischengespeichert werden. Erst beim Beenden des Programmes werden die Buffer ausgegeben. Welche Buffer zuerst ausgegeben werden ist von der Implementierung abhängig. Du kannst das Ausgeben der IOStream Buffer mit std::flush forcieren. Für die printf Buffer ist fflush zuständig.
Außerdem steckt dein Programm voller Fehler. Korrekt sollte es ungefähr so aussehen:
#include <iostream> #include <cstdio> char abc[]=":op"; int main() { std::cout << "Moin!\n" << std::flush; std::printf("Höhö %s \n", abc); }
-
weil die iostream.h veraltet ist,
und man heute die <iostream> aus dem
namensraum std einbindet.Devil
-
Also ich kann das nicht bestätigen. Bei mir kommt cout vor printf.
-
Normalerweise verlangt der Standard, dass beide Arten der Ausgabe synchronisiert sind. Deshalb sollte das Phänomen bei keinem modernen Compiler auftreten.
Wenn man die libstdc++ benutzt (liegt beim gcc bei), kann man die IOStreams and C Buffer voneinander abkoppeln und das gleiche Verhalten erhalten:
#include <iostream> #include <cstdio> char abc[]=":op"; int main() { std::ios::sync_with_stdio(false); //Abkoppeln std::cout << "Moin!\n"; std::printf("Höhö %s \n", abc); std::fflush(stdout); //Zwinge C Buffer zum rausschreiben }
Wenn man auf das std::fflush(stdout); verzichtet, kann man nicht vorhersagen, welcher Buffer zuerst rausgeschrieben wird. Bei mir ist es der C Buffer.
Normalerweise sollte man dies nur dann benutzen, wenn man ganz auf die C Art der Ausgabe verzichtet. Dann gewinnt man durch das Trennen der Buffer Performance, da keine Synchronisation stattfinden muss.
-
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Da kann man sich wohl lange und ergebnislos drum streiten. Mir persönlich ist die Typsicherheit doch noch was wert, deswegen kann ich das C-stdio-System nicht ausstehen. Zumal auf der Tastatur z.B. d direkt neben s liegt - denk zum Beispiel an
printf("Die Antwort lautet %s.\n", 42);
Was die Möglichkeiten angeht - was printf kann, kriegste mit iomanip auch locker hin. Du tippst vielleicht etwas mehr, aber dafür ist der Code nachher sowohl lesbar als auch typsicher. Einziger Nachteil - die C++-Streams sind deutlich langsamer. Aber wenn das zum Problem wird, greif ich halt auf boost::format zurück.
-
Ponto schrieb:
Außerdem steckt dein Programm voller Fehler.
ich gebe ja zu, dass es nicht schön und anspruchsvoll ist, aber für meinen compiler hat es für eine "0 fehler, 0 warnungen"-ausgabe gereicht. und mehr wollte ich in dem augenblick auch nicht erreichen.
trotzdem werde ich mir natürlich mal deine veränderungen zu gemüte führen.die erklärung mit den buffern und der unterschiedlichen ausgabe erscheint mir am sinnvollsten.
@ghj
das mag ja sein, bei mir ist das aber nicht so. mit welcher programmierumgebung programmierst du denn?@net
<<endl konnte ich nicht mehr ausprobieren, dann kam mein LNK1000-Problem auf (http://c-plusplus.net/forum/viewtopic.php?t=84774)@0xdeadbeef
boost? iomanip? oha, da liegt noch viel arbeit vor mir...danke für eure antworten!!!
-
Biks schrieb:
@ghj
das mag ja sein, bei mir ist das aber nicht so. mit welcher programmierumgebung programmierst du denn?Mit dem gleichen Prog wie du, Visual C++.
-
ich gebe ja zu, dass es nicht schön und anspruchsvoll ist, aber für meinen compiler hat es für eine "0 fehler, 0 warnungen"-ausgabe gereicht
dann ist dein compiler aber sehr alt und erfüllt nicht mehr die heutigen standards.
-
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Ach? Was kann ich denn mit printf machen was ich mit cout nicht machen kann?
-
ghj schrieb:
Biks schrieb:
mit welcher programmierumgebung programmierst du denn?
Mit dem gleichen Prog wie du, Visual C++.
6.0?
@otze
das kann gut sein, wir haben an der hochschule halt keine anderen. für lehr- und lernzwecke scheint es auszureichen. bei professionellen anwendungen mögen die grenzen heutzutage schnell erreicht sein.
-
MaSTaH schrieb:
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Ach? Was kann ich denn mit printf machen was ich mit cout nicht machen kann?
Das Programm ganz einfach abschießen.
-
Guter Einwand
!
-
Biks schrieb:
@otze
das kann gut sein, wir haben an der hochschule halt keine anderen. für lehr- und lernzwecke scheint es auszureichen. bei professionellen anwendungen mögen die grenzen heutzutage schnell erreicht sein.hier gehts nicht um professionalität sondern um richtigkeit.
ein #include <iostream.h> oder void main(){} ist schlichtweg falsch.dazu kommt noch, dass man zb den MinGW kostenlos bekommt, und der eigentlich neueeste technologien bietet, wer brauch da noch vc++ 6.0?
-
otze schrieb:
hier gehts nicht um professionalität sondern um richtigkeit.
ein #include <iostream.h> oder void main(){} ist schlichtweg falsch.aja? also das interessiert mich jetzt näher. wieso sollte das falsch sein?
warum muss das immer so kompliziert sein??? wieso kann eine textausgabe nicht entweder printf() ODER cout<< sein? warum müssen beide existieren? und wieso sagst du, dass das was funktioniert falsch ist? und wie erkläre ich das meinem prof?
kann es sein, dass ich standard C versuche zu programmieren und du von richtigem C++ redest? wie schon gesagt, ich orientiere mich lediglich an meiner lehrveranstaltung. wenn mir da was wirklich falsches beigebracht wird, dann bin ich natürlich für die richtigen wege offen.
-
Biks: http://tutorial.schornboeck.net/groessten_luegen.htm
btw, printf ist C und cout ist C++, printf ist aber (da C eine Teilmenge von C++ bildet) auch in C++ enthalten; verwenden solltest Du im Regelfall aber eher die C++-Streamfunktionalität.
-
Den Header den du verwendest hat eigentlich jeder Compiler, da er noch aus der Zeit vor dem C++-Standard kommt und damals "inoffizieller" Standard war.
Das void main() hat sich wohl irgendwanneinmal eingeschlichen und viele Compiler akzeptieren es, es ist jedoch weder Konform zum C noch zum C++-Standard, aber _falsch_ ist es nicht, außer hier im ISO-C++ Forum, oder im ANSI-C Forum.
Aber jeder hat das Recht alle Features zu nutzen die der Compiler/Bibliothek bietet, nur wird man dadurch eben etwas unabhängiger.
Jedoch solltest du die Sprache schon so verwenden wie es der Standard vor sieht.