std::clog umleiten

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

std::clog umleiten

Beitrag von Glocke » Mo Mär 03, 2014 1:34 pm

Hi,
ich möchtel std::clog umleiten, so dass ich die Inhalte (wahlweise) in eine Logfile schreiben oder in einer GUI ausgeben kann. Mit freopen könnte ich den Stream in eine Datei lenken - nur fehlt mir dann eben die Möglichkeit die Sachen optional in meiner GUI auszugeben ^^
Welche Möglichkeiten habe ich?

Danke im Voraus ^^

LG Glocke

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: std::clog umleiten

Beitrag von mfro » Mo Mär 03, 2014 6:00 pm

Stream-Objekte lassen sich kopieren ;)

Code: Alles auswählen

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
  ofstream out;

  if (argc > 1)
    out.open(argv[1]);
  else {
    out.copyfmt(clog);
    out.clear(clog.rdstate());
    out.basic_ios<char>::rdbuf(clog.rdbuf());
  }

  out << "Hallo" << std::endl;
}
Mit einem Parameter aufgerufen, schreibt das Progrämmchen in eine Datei mit entsprechendem Namen, sonst auf eine Kopie von std::clog
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: std::clog umleiten

Beitrag von Glocke » Di Mär 04, 2014 2:48 pm

Danke für deine Antwort!

Nur habe ich dann die Möglichkeit entweder in eine Datei- oder auf die GUI zu schreiben. Ich bin vorhin über folgende Lösungsidee auf Basis von Boost IOStreams gestoßen:

Code: Alles auswählen

#include <boost/iostreams/concepts.hpp> 
#include <boost/iostreams/stream_buffer.hpp>
#include <iostream>

namespace bio = boost::iostreams;

class MySink : public bio::sink
{
public:
    std::streamsize write(const char* s, std::streamsize n)
    {
        //Do whatever you want with s
        //...
        return n;
    }
};

int main()
{
    bio::stream_buffer<MySink> sb;
    sb.open(MySink());
    std::streambuf * oldbuf = std::clog.rdbuf(&sb);
    std::clog << "hello, world" << std::endl;
    std::clog.rdbuf(oldbuf);
    return 0;
}
Das funktioniert für mich super, da ich innerhalb der write-Methode sowohl in die Datei als auch auf meine GUI schreiben kann.

LG Glocke

Antworten