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