Вывод на экран и в файл

359
28 декабря 2016, 04:26

Нужно вывести одно и то же на экран и в файл, например:

fout << "x = " << x;
cout << "x = " << x;

Как реализовать перегрузку операции <<, чтобы каждый раз приходилось писать команду вывода только один раз?

Answer 1

Вы хотите внести в оператор вывода вывод "x = " или вывод одновременно и в файл, и на экран? И то и другое - насколько это разумно?

В первом случае, что бы вы ни выводили, все пойдет с надписью "x ="...

Во втором - что бы вы ни выводили в любой файл - пойдет еще и на экран...

Оно вам точно надо?..

class PairStream
{
public:
    PairStream(ostream& f):file(f){}
    template<typename T>
    PairStream& operator<<(const T& t)
    {
        cout << t;
        file << t;
        return *this;
    }
    ostream& file;
};
int main(int argc, const char * argv[])
{
    ofstream f("log");
    PairStream p(f);
    int x = 100;
    p << "x = " << x << "\n";
}
Answer 2

Если нет предубеждения на использование boost, можно воспользоваться этим примером http://stackoverflow.com/questions/999120/c-hello-world-boost-tee-example-program

или

#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/compose.hpp>
#include <fstream>
#include <iostream>
#include <iomanip>
template<typename T1, typename T2>
boost::iostreams::stream< boost::iostreams::tee_device<T1,T2> >
make_tee_ostreams(T1& arg1, T2& arg2)
{
    typedef boost::iostreams::tee_device<T1,T2> device;
    typedef boost::iostreams::stream< device > stream;
    return stream( device(arg1, arg2) );
}
int main(int argc, char *argv[])
{
    std::ofstream file1("file1.txt");
    std::ofstream file2("file2.txt");
    auto file12 = make_tee_ostreams( file1, file2 );
    file12 << "Hello World!" << std::endl;
    return 0;
}
Answer 3

Решение на основании комментария ТС:

Хотелось бы определить другой класс PairStream и перегрузить операцию вывода для этого класса, чтобы вместо двух строк написать: PairStream s(fout); s << "x = " << x;

class PairStream {
public: 
    PairStream(std::ostream& one, std::ostream& two) : one(one), two(two) {}
private:
    std::ostream& one;
    std::ostream& two;
};
PairStream& operator<< (PairStream& str, const UserType& ut)
{
    str.one << ut;  // Предпологается, что для UserType реализован вывод в поток
    str.two << ut;
    return str;
}
Answer 4
void function_out (int x)
{
  m_fout << "x = " << x;
  m_cout << "x = " << x;
}
READ ALSO
Решить задачу по программирыванию С++ [требует правки]

Решить задачу по программирыванию С++ [требует правки]

Составить функцию, позволяющую определить позицию первого вхождения в заданный строку некоторого символа с другой заданной строкиРезультатом...

386
резервное копирование данных и баз с сервера на ubuntu 12.04

резервное копирование данных и баз с сервера на ubuntu 12.04

Проект развернуть на сервере уже какое-то время и пришла пора задуматься о бекапирвоании

341
Не могу запустить .sql скрипт в MySQL Workbench

Не могу запустить .sql скрипт в MySQL Workbench

Сделал диаграмму БД в MySQL Workbench, потом экспортировал ее вsql

516