cout Ausgaben in txt Datei schreiben



  • Hallo,

    möchte meine ganzen Kontrollausgaben (momentan über cout) AUCH in eine Textdatei schreiben. Möchte aber nicht an jede cout Stelle gehen und den gleichen Inhalt nochmal auf eine Textdatei richten.

    Gibt es eine Möglichkeit die Funktion cout so umzuschreiben, dass die Ausgaben auf dem Bildschirm erscheinen UND in eine Textdatei geschrieben werden ?

    Das müsste doch über namespaces gehen, oder ???
    Momentan nutz ich überall den std namespace.

    danke für jeden Hinweis/ jede Hilfe



  • ja das geht, aber ich würd keine Textdatei benutzen...
    Nehm eine .avi die is kleiner 😉



  • @mero
    der war genial



  • Schau mal nach der C Funktion freopen(...). Sollte auch mit C++ funktionieren.

    Hier noch ein sehr unvollständiges Snippet zur Anregung:

    #ifdef MYCONSOLE
        /* start own console in an own thread */
        _beginthread(XWLogLoop,2000,NULL);
        while (TailIsRunning == FALSE) {
            Sleep(100);
        }
    #endif
    
    #ifdef WINCONSOLE
        AllocConsole();
    
        freopen("CONIN$", "rb", stdin);
        freopen("CONOUT$", "wb", stdout);
        freopen("CONOUT$", "wb", stderr);
    #endif
    
    #ifdef LOGFILE
            elog = fopen(XWinLogfile, "w");
            fclose(elog);
            olog = freopen(XWinLogfile, "a", stdout);
            elog = freopen(XWinLogfile, "a", stderr);
    #endif
    


  • brainesic schrieb:

    Das müsste doch über namespaces gehen, oder ???
    Momentan nutz ich überall den std namespace.

    Ach übrigens. Nur so'n paar Anregungen (hat mir google einst geschickt)

    http://www.cprogramming.com/tutorial.html
    http://www.cplusplus.com/doc/tutorial/
    http://www.intap.net/~drw/cpp/
    http://www.freshsources.com/
    http://www.informatik.fh-luebeck.de/ti/Seehusen/Publications/UnixMail/4-231.pdf
    http://cis.stvincent.edu/swd/index.html
    http://cis.stvincent.edu/swd/except/except.html
    http://www.freshsources.com/Except1/ALLISON.HTM
    http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html

    p.s. Glaub' niemandem, der behauptet für C++ bräuchte man kein C zu können
    (Allein der Name legt das Gegenteil schon nahe...)



  • Pdug schrieb:

    p.s. Glaub' niemandem, der behauptet für C++ bräuchte man kein C zu können
    (Allein der Name legt das Gegenteil schon nahe...)

    Ja, ich behaupte es immer noch! Warum? Weil deshalb:

    std::ofstream datei("cout.txt");
    
      std::cout.rdbuf(datei.rdbuf());         // cout wird in die geöffnete Datei umgeleitet
      std::cout << "Hallo!";  // String wird in Datei geschrieben
    

    freopen sagt mir nämlich als Nie-C-gelernt Mensch nichts. 🙄



  • p.s. Glaub' niemandem, der behauptet für C++ bräuchte man kein C zu können
    (Allein der Name legt das Gegenteil schon nahe...)

    glaub niemandem der mit C anfing, dass er C++ jemals lernt!
    (denn die art des programmeirens ist komplett anders)



  • Achja, wenn man den normalen Zustand wieder haben will, muß man sich den alten Zustand in einem Streambuffer merken. Hier auf MSDN gibts ein Beispiel:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfbasiciosrdbuf.asp



  • otze schrieb:

    glaub niemandem der mit C anfing, dass er C++ jemals lernt!
    (denn die art des programmeirens ist komplett anders)

    Grins - C++ ist irgendwie objektorientiert, ne?

    Vom überladen von Operatoren hab ich noch nie was gehalten.

    std::cout << "Hallo!"; heißt bei mir debug("Hallo"); und hat letztlich was mit printf zu tun ...

    Cheers



  • @Artchi

    cout = datei
    

    (aus der alten Edition) fand ich eleganter ...

    freopen oder rdbuf -- ist doch nur syntaktischer Zucker 😉



  • Man soll C und C++ nicht mischen 🙄
    C++ bietet schließlich zu fast allem was C kann gute Alternativen.



  • phlox81 schrieb:

    Man soll C und C++ nicht mischen 🙄
    C++ bietet schließlich zu fast allem was C kann gute Alternativen.

    Genaugenommen ist genau das zur Zeit meine Aufgabe ...

    IMHO: Ohne triftigen Grund sollte man C++ gegenüber C vorziehen · C++ ist typsicherer, modularer uvm ...
    (und wär es nicht so langsam: Java ·
    oder C# ? - kenn ich persönlich noch nicht, habe nur mal von Properties in C# gehört und das hörte sich gut an)



  • Grins - C++ ist irgendwie objektorientiert, ne?

    nein, wenn überhaupt dann objektbasiert, aber eher multiparadigm, ändert aber nichts an der tatsache, dass C++ anders funktioniert.

    Vom überladen von Operatoren hab ich noch nie was gehalten.

    schade, da entgeht dir ne Menge.

    std::cout << "Hallo!"; heißt bei mir debug("Hallo"); und hat letztlich was mit printf zu tun ...

    nein, hat es nicht. C++ streams setzen nicht auf den C funktionen auf.
    hätte es was mit printf zu tun, hätte man ein problem mit eigenen typen und insbesondere mit templates!

    (und wär es nicht so langsam: Java. [...])

    deine Infos sind veraltet, java ist nicht langsam.



  • Argh... objektorientiert programmieren heißt nicht, dass man irgendwo class vorschreibt. Auch mit C kann man objektorientiert programmieren... man sehe sich mal die File-Schnittstelle an. Ich glaub aber mal... Thema verfehlt ^^ Sollte woanders fortgesetzt werden.



  • schade, da entgeht dir ne Menge.

    Mag sein. - Nur um dir ne Freude zu machen werd ich meine Haltung dazu noch mal überdenken.

    ...hat letztlich was mit printf zu tun

    ist zu lesen: Ich verwende für Methoden wie z.B. debug("Hallo"); noch printf (ist mitnichten eine Aussage über C++ oder guten Programmierstil)

    Java hat sich in den letzten Jahren sehr positiv entwickelt · Bei einem sukzessiven Wechsel in den letzten Monaten (Java Projekt endete - C++ Projekt begann) habe ich einen Performanceunterschied bemerkt. (Habe keine Benchmarktests gemacht ..) Worauf ich unten hinaus wollte: Solche Unterschiede außer Acht gelassen würde ich Java im Zweifelsfall gegenüber C(++) den Vortritt lassen

    (objektorientiert programmieren heißt auch nicht, dass man irgendwelche Methoden nicht benutzen darf, weil sie aus dem falschen Stall kommen.)



  • Bitte keine Java vs. C++ Diskussion. Sonst fang ich auch gleich an. 😃 Im ernst, lasst es. Der Fragesteller hat jetzt eine Lösung auf seine Frage und gut ist.



  • Bitte keine ...

    Ganz im ernst: Geht mir auch so · und schönes WE noch ...



  • brainesic schrieb:

    möchte meine ganzen Kontrollausgaben (momentan über cout) AUCH in eine Textdatei schreiben. Möchte aber nicht an jede cout Stelle gehen und den gleichen Inhalt nochmal auf eine Textdatei richten.

    Gibt es eine Möglichkeit die Funktion cout so umzuschreiben, dass die Ausgaben auf dem Bildschirm erscheinen UND in eine Textdatei geschrieben werden ?

    Ja, diese Möglichkeit gibt es. Zunächst muss man einiges dazu wissen. 'cout' ist keine Funktion sondern ein Objekt vom Type std::ostream. In C++ bzw. genauer in der Input/Output-Library von C++ ist jede IO-Konstruktion immer zweigeteilt. Auf der einen Seite stehen die iostream's und auf der anderen die streambuf's. Letztere und nur die sind dafür zuständig Zeichen irgendwo hinzuschreiben oder irgendwo rauszulesen. Die Streams dienen 'nur' der Formatierung und als Anwender-Schnittstelle.

    D.h. wenn Du die Ausgabe verdoppeln willst, musst Du an den Streambuf von cout ran. Die Idee ist, zwischen dem cout-Objekt und seinem Streambuf einen weiteren Streambuf (im folgenden mal 'Weiche' genannt) zu hängen und alle Zeichen, die dort durchkommen auch an einen weiteren Streambuf Deiner Wahl zu leiten.

    So könnte es aussehen:

    #include <iostream>
    #include <fstream>
    #include <streambuf>
    
    class Weiche : public std::streambuf
    {
    public:
        typedef std::streambuf base_type;
        typedef base_type::traits_type traits_type;
    
        Weiche( std::ostream& out, std::ostream& out2 )
            : m_sb1( out.rdbuf() )
            , m_sb2( out2.rdbuf() )
            , m_out1( out )
        {
            out.rdbuf( this );  // hänge mich selbst bei 'out' als Streambuf ein.
        }
    
        ~Weiche() 
        {
            m_out1.rdbuf( m_sb1 ); // Stellt die Ausgangssituation wieder her
        }
    
    protected:
        virtual overflow( int_type c = traits_type::eof() )
        {   // jedes Zeichen an BEIDE Streambufs sb1 & sb2 weitergeben
            if( m_sb1 && m_sb2 
                && !traits_type::eq_int_type( m_sb1->sputc( c ), traits_type::eof() )
                && !traits_type::eq_int_type( m_sb2->sputc( c ), traits_type::eof() )
                )
                return traits_type::not_eof( c );
            return traits_type::eof();  // einer der Streambufs tut nicht
        }
    
    private:
        Weiche( const Weiche& );
        Weiche& operator=( const Weiche& ); // Kopieren verhindern
    
        std::streambuf* m_sb1;
        std::streambuf* m_sb2;
        std::ostream& m_out1;
    };
    
    int main()
    {
        using namespace std;
        ofstream fout("cout.log");
        Weiche w( cout, fout );     // Ausgaben von cout gleichzeitig auf fout lenken 
    
        cout << "ein kleines Programm ... " << endl;
        for( int i=0; i<10; ++i )
            cout << " " << i;
        cout << "\nProgramm-Ende" << endl;
        return 0;
    }
    

    ..das ist nicht die performanteste Lösung, aber sie braucht nicht so viel Code.

    Gruß
    Werner





  • Besten Dank Werner Salomon,

    das nenn ich mal kompetente Hilfe. 👍 👍 👍
    Einfach ausgezeichnet!

    Nochmals Vielen Dank


Log in to reply