Seite 1 von 1

std::clog umleiten

Verfasst: Mo Mär 03, 2014 1:34 pm
von Glocke
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

Re: std::clog umleiten

Verfasst: Mo Mär 03, 2014 6:00 pm
von mfro
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

Re: std::clog umleiten

Verfasst: Di Mär 04, 2014 2:48 pm
von Glocke
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