printf() "schneller" als cout<<?



  • 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.



  • 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?

    Also es gibt zwei Möglichkeiten:
    (1) Der Herr Professor erklärt seinem Student den Unterschied zwischen C und C++ und die Bedeutung des C++-Standards von 1998(!das müsste sich auch schon an den Unis rumgesprochen haben!).
    (2) Du informierst dich selbst (der bessere Weg):
    http://www.cpp-tutor.de/cpp/toc.htm
    http://tutorial.schornboeck.net/inhalt.htm
    http://www.volkard.de/C++/Tutorial/Grundlagen/
    http://de.geocities.com/throni3/cpp/Inhalt.html
    http://www.henkessoft.de/cpp_konsole.htm

    Man sollte cout und printf nicht mischen, da beide verschiedene Puffer verwenden und nicht gut zusammen passen. Es kann aber auch gut gehen.

    Nachfolgend ein C++-Programm mit drei Schleifentypen (for, while, do/while) und cout / printf:

    #include <iostream> 
    #include <cstdio>
    using namespace std; 
    
    int main() 
    { 
       for(int i=0; i<10; ++i) 
       { 
            cout << "Erste Schleife:  " << i << endl; 
            printf("Erste Schleife:  %d\n",i);
       } 
    
       int j=0; 
       while(j<10) 
       { 
           ++j; 
           cout << "Zweite Schleife: " << j << endl; 
           printf("Zweite Schleife: %d\n",j);
       } 
    
       int k=0; 
       do 
       {
           ++k; 
           cout << "Dritte Schleife: " << k << endl; 
           printf("Dritte Schleife: %d\n",k);       
       } 
       while(k<10);
       cin.get(); 
    }
    

    Wenn dein Compiler das nicht versteht, verwende einen standardkonformen. Es gibt genügend kostenlose Compiler/Linker bzw. IDE's. Ich empfehle Dev-C++ (aktuell: 4.9.9.10) für Konsolenprogramme.



  • Der C++-Standard definiert genau zwei gültige Signaturen für main, nämlich

    int main() { /* ... */ } // In C99 schreibt man int main(void) statt int main()
    int main(int argc, char *argv[]) { /* ... */ }
    

    Alles andere ist schon deswegen völliger Bockmist. In der Praxis funktioniert void main trotzdem oft, aber es gibt durchaus Fälle, in denen dir das das Genick bricht. Der gcc akzeptiert es deswegen auch ab Version 3.4 nicht mehr.

    Beispiel: http://users.aber.ac.uk/auj/voidmain.shtml


Anmelden zum Antworten