stdout durch eine Funktion schleifen?



  • Guten Morgen,

    ich bin ein Quereinsteiger in Sachen C++ 😉 das Vorab.

    Meine aktuelle Aufgabe lautet:
    "Versuch doch mal stdout durch deine Funktion zu leiten".
    Kleiner Exkurs, was macht "deine Funktion":
    Diese formatiert die Konsolenausgabe (farbe, Position etc.)

    Entwicklen tue ich mit Qt 5.0.2 via MSVS mit dem MSVC2012 32Bit und QtCreator auf Linux 32 Bit.

    Ich habe jetzt schon viel im Netz gelesen. Aber es scheint so als ob man die stdout nicht umleiten bzw. durch etwas durchschleifen kann.

    Folgende vier Ansatz Ideen habe ich:

    • stdout durch eine Funktion durchschleifen, sofern überhaupt möglich
    • stdout mittels freopen in eine Datei schreiben und wieder auslesen.
    • einen eigenen QTextStream definieren und sich da irgendwie einklinken
    • ein QProcess, kommt aber nicht in frage

    Nun die Fragen zu den vier ansätzen:

    • Wenn ich stdout "durchschleifen" kann, wie könnte ich dies Anstellen?
    • Eine Datei einlesen mittels QFile() ist kein Problem.
      Ich müsste mir die Zeile merken und ab dieser Zeile alles ausgeben.
      Aber wie kriege ich zur Laufzeit mit, dass die Datei aktualisiert wurde?
      Kann ich das mit Signals und Slots lösen? Quasi ein Event "Oh neue Zeile in Datei, sende ein Signal"?
      Ich möchte nämlich nicht hinter jedes printf() etc eine weitere Funktion einfügen und aufrufen.
    • Wie könnte ich mich denn in den QTextStream() einklinken, so das erst "deine Funktion" aufgerufen und dann nach stdout geschrieben wird?
      [+] Ich würde ungern die Anwendung Rekursiv aufrufen um mittels QProcess die Ausgabe abzufangen.

    Vielen Dank!



  • stdout durch eine Funktion schleifen

    Keine Ahnung, was das bedeutet. Der Rest deines Beitrags gab auch keinen Hinweis.



  • Okay wird das so klarer?

    printf("Ausgabe") -> + -> Der normale Weg zur stdout -> + -> stdout
                         |                                  |
                         + ->  Manipulation der Ausgabe  -> +
    


  • In welcher Programmiersprache? In C++ ueberlaed man einfach << fuer std::cout und den entsprechenden Typen. In C musst du dein eigenes printf anbieten, Ausgabe manipulieren und das orginale printf aufrufen.

    Leider wirkst du nicht sehr erfahren, da du von printf in C zu Qt springst, ohne bei C++ kurz anzuhalten. Und warum moechtest du stdout in eine Datei umleiten, was spricht gegen fprintf, ....

    Hast du schon irgendwas probiert? beispielsweise stdout zu schliessen und mittels fopen neu zuzuweisen?



  • Programmiersprache Qt (C++)

    Das ich das << Überladen kann ist mir bewusst. Auch das ich eigene Funktionen anbieten kann. Ich kann auch mit QTextStream meinen eigenen Stream machen.
    Ich möchte und kann aber nicht alle gegebenen Klassen, Librarys von printf auf eine eigene Funktion abändern.

    Daher ja die Frage ob ich die Standardausgabe umleiten/durschleifen kann. Damit ich am bestehenden nichts ändern brauche.



  • ...



  • Weil ich von einigen Librays die Quelltexte nicht habe und nur als *.a *lib *.dll bzw *.so vorliegen.

    Von den weiteren OpenSource Libs die angebunden werden, habe ich die Quelltexte.
    Hier möchte dann aber vermeiden mit jeder weiteren Version, erneut "Suchen und Ersetzen" durchzuführen.



  • ...



  • Gegenfrage: Warum moechtest du das?



  • im gleichen prozess (also ohne QProzess)
    hasst du auf c++ ebene keine "wirkliche" chance da was zu verbiegen ....

    Die c/c++ umgebung emuliert dir die Filehandles stdin,stdout,stderr ...
    Die bekommen meist noch fixe handle nummern.

    jede printf / funktion und std::cout nutzen diese Handles ohne das dazwischenkommst.

    Also generisch keine chance ....

    Betriebssystemspezifisch keine ahnung ob man da was tricksen kann ... ich hab da noch nix gesucht.

    Tja, wenn die libs / dlls das nicht vorsehen, das man statt auf die standard ausgabe woandershin schreibt, dann geht das nur mit boesen tricks.
    Und als erstes wuerd ich auch QProcess in erwägung ziehen ...

    Ciao ...



  • knivil schrieb:

    Gegenfrage: Warum moechtest du das?

    Weil das meine Aufgabe ist 😉

    RHBaum schrieb:

    im gleichen prozess (also ohne QProzess)
    hasst du auf c++ ebene keine "wirkliche" chance da was zu verbiegen ....

    Die c/c++ umgebung emuliert dir die Filehandles stdin,stdout,stderr ...
    Die bekommen meist noch fixe handle nummern.

    jede printf / funktion und std::cout nutzen diese Handles ohne das dazwischenkommst.

    Also generisch keine chance ....

    Betriebssystemspezifisch keine ahnung ob man da was tricksen kann ... ich hab da noch nix gesucht.

    Tja, wenn die libs / dlls das nicht vorsehen, das man statt auf die standard ausgabe woandershin schreibt, dann geht das nur mit boesen tricks.
    Und als erstes wuerd ich auch QProcess in erwägung ziehen ...

    Ciao ...

    Danke, QProcess soll zwar nicht, aber gut. Ich werde diese Möglichkeit mal als Option umsetzen.

    Was ich der weilen noch versucht habe, ist die stdout mittels freopen() in eine Datei zu schreiben. Auf dieser Datei habe ich dann ein QFileSystemWatcher laufen lassen. Via Signal und Slot warte ich auf das fileChanched Signal um die Datei wieder einzulesen ^^
    Problem ist nur das freopen() die Datei erst Schreibt wenn ein fclose() erfolgt.



  • Schon fflush ausprobiert?

    Weil das meine Aufgabe ist

    Halte ich fuer ein Geruecht. Kennst du die Dateiumleiteoperatoren, die man dem Programm mitgibt?



  • knivil schrieb:

    Schon fflush ausprobiert?

    Weil das meine Aufgabe ist

    Halte ich fuer ein Geruecht. Kennst du die Dateiumleiteoperatoren, die man dem Programm mitgibt?

    fflush - nein.

    Die Dateiumleiteoperatoren kenne ich, ich möchte das aber im Programm lösen und nicht von "aussen".


Anmelden zum Antworten