Пиша код, където трябва да отпечатам едни и същи данни на конзолата и във файл. Има ли начин да попълните общ обект на изходен поток и след това да го покажете на конзолата с помощта на cout и да го експортирате във файл, като използвате библиотеки fstream и iostream?
Има ли начин да се създаде общ обект на изходен поток за отпечатване на конзолата и във файл в c++?
Отговори (1)
Сигурен. Просто бихте създали подходящ буфер за поток, който вероятно съхранява в други буфери за поток, в които пише вътрешно. Използвайки този буфер на потока, след това ще създадете std::ostream
, на който пишете.
Например, ето просто изпълнение на този подход:
#include <streambuf>
#include <ostream>
class teebuf
: public std::streambuf
{
std::streambuf* sb1_;
std::streambuf* sb2_;
int overflow(int c) {
typedef std::streambuf::traits_type traits;
bool rc(true);
if (!traits::eq_int_type(traits::eof(), c)) {
traits::eq_int_type(this->sb1_->sputc(c), traits::eof())
&& (rc = false);
traits::eq_int_type(this->sb2_->sputc(c), traits::eof())
&& (rc = false);
}
return rc? traits::not_eof(c): traits::eof();
}
int sync() {
bool rc(false);
this->sb1_->pubsync() != -1 || (rc = false);
this->sb2_->pubsync() != -1 || (rc = false);
return rc? -1: 0;
}
public:
teebuf(std::streambuf* sb1, std::streambuf* sb2)
: sb1_(sb1), sb2_(sb2) {
}
};
class oteestream
: private virtual teebuf
, public std::ostream {
public:
oteestream(std::ostream& out1, std::ostream& out2)
: teebuf(out1.rdbuf(), out2.rdbuf())
, std::ostream(this) {
this->init(this);
}
};
#include <fstream>
#include <iostream>
int main()
{
std::ofstream fout("tee.txt");
oteestream tee(fout, std::cout);
tee << "hello, world!\n";
}
person
Dietmar Kühl
schedule
30.11.2014
Персонализираният поточен буфер може да е прекален тук. Записването в
stringstream
и извеждането на това два пъти може да е достатъчно добро. Както и да е, добър. (BTW: Имате ли този код наоколо?)
- person Deduplicator; 30.11.2014
@Deduplicator: да, има решение, което е PITA за използване и подходящо решение, което е приятно за използване. Опаковането на буфера на потока в
std::ostream
прави буфера на потока tee доста приятен за използване. ... и, да, имах този код наоколо: не пиша толкова бързо :-)
- person Dietmar Kühl; 30.11.2014
boost::iostreams::tee_device
. - person 0x499602D2   schedule 30.11.2014