cout umbiegen?



  • Ist es möglich cout via C++-Standard auf einen anderen Buffer umzubiegen?

    Hintergrund: cout schreibt mir immer auf STD_OUTPUT_HANDLE, ich möchte aber, dass es auf einen von mir definierten Console-Screen-Buffer schreibt. Also wär mir nach einem Wechsel des CSB folgendes recht:

    cout << flush;
    cout.setbuf( new_csb.buffer );
    

    Hab ich da Chancen?

    MfG SideWinder



  • Ist das hier "korrekt"?

    #include <fcntl.h>
    #include <io.h>
    
    ...
    
    int handle = _open_osfhandle(reinterpret_cast<intptr_t>(GetBuffer(buffer).buffer), _O_TEXT);
    FILE* fp = _fdopen(handle, "w");
    *stdout = *fp;
    ios::sync_with_stdio();
    

    Ich weiß nicht mher unbedingt C++-Standard, aber hier könnte noch am ehesten jemand davon wissen. Ansonsten bitte verschieben nach WinAPI 🙂

    MfG SideWinder



  • Scheint international anerkannt zu sein. Ein Problem habe ich noch: Normalerweise wird ausgegeben was man mit cin eingibt, das scheint nicht zu funktionieren.

    Hat jeder Screen-Buffer seinen eigenes InputHandle? Wie kann ich das beziehen?

    MfG SideWinder



  • SideWinder schrieb:

    Ist das hier "korrekt"?

    Nicht wirklich. Da war deine erste Variante schon besser (abgesehen davon, daß die richtige Methode rdbuf() heißt):

    ofstream ofile("cout.txt");
    streambuf* oldbuf=cout.rdbuf();//alten Ausgabepuffer zwischenspeichern
    cout.rdbuf(ofile.rdbuf());
    ...
    //alle cout-Ausgaben werden in die Datei umgeleitet
    ...
    cout.rdbuf(oldbuf);//Puffer rekonstruieren
    


  • Wäre ein solches "Umbiegen" eine globale änderung oder nur lokal z.B. innerhalb einer Klasse oder Übersetzungseinheit?



  • Kommt ganz darauf an, wie groß du "global" definierst - das betrifft afaik dein gesamtes Programm.



  • Gut genau das meinte ich.
    Thx



  • @CSToll: Und wie kann ich da auf einen anderen console screen buffer umbiegen? Wohl gar nicht, nein ich glaube schon, dass ich auf dem richtigen Weg bin. Allerdings sieht man bei cin die Eingabe nicht mehr, also irgendwo muss ich noch ein Rädchen umdrehen.

    MfG SideWinder



  • SideWinder schrieb:

    @CSToll: Und wie kann ich da auf einen anderen console screen buffer umbiegen? Wohl gar nicht, nein ich glaube schon, dass ich auf dem richtigen Weg bin. Allerdings sieht man bei cin die Eingabe nicht mehr, also irgendwo muss ich noch ein Rädchen umdrehen.

    MfG SideWinder

    Dazu musst du dich natürlich an die Spielregeln halten und für deine Konsole einen Streambuffer implementieren.


Anmelden zum Antworten