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
			
									
									std::clog umleiten
std::clog umleiten
Rage - ein "modernes" Rogue-like (C++11, SFML)
						Re: std::clog umleiten
Stream-Objekte lassen sich kopieren 
Mit einem Parameter aufgerufen, schreibt das Progrämmchen in eine Datei mit entsprechendem Namen, sonst auf eine Kopie von std::clog
			
									
									
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;
}
It's as simple as that. And remember, Beethoven wrote his first symphony in C.
						Re: std::clog umleiten
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:
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
			
									
									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;
}LG Glocke
Rage - ein "modernes" Rogue-like (C++11, SFML)
						