Тема: [не питання]Буфер потоку
В мене було багато класів які виводили інформацію (результат їхньої роботи) в консоль, але згодом мені потрібно було вивести всю інформацію у файл.
Це можна зробити за допомогою команди ">" Windows консолі
program.exe > text.txt
або замінити буфер у cout, ось приклад як це зробити:
std::cout.rdbuf( streambuf ); - Заміна буфера для cout
у функції main читайте коментарі
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <string>
class Abstract
{
public:
virtual void print() const = 0;
};
class A : public Abstract
{
public:
void print() const override
{
std::cout<<"A\n";
}
};
class B : public Abstract
{
public:
void print() const override
{
std::cout<<"B\n";
}
};
class C : public Abstract
{
public:
void print() const override
{
std::cout<<"C\n";
}
};
int main()
{
/*Ініціалізація класів*/
A obj1;
B obj2;
C obj3;
Abstract *arr[] = {&obj1, &obj2, &obj3};
std::filebuf* fout = new std::filebuf;/*Буфер потоку для читання та запису файлів*/
std::streambuf* backup = std::cout.rdbuf();/*Копія потоку консолі*/
std::string filename = "text.txt";/*Ім'я файлу*/
if(! fout->open(filename, std::ios::out | std::ios::trunc))/*Відкриття файлу*/
throw std::runtime_error("File " + filename + " cannot be opened");/*Обробка помилки*/
std::cout.rdbuf(fout);/*Заміна буфера для cout*/
/*Виведення...*/
for(int i = 0; i < 3; i++)
{
arr[i]->print();
}
fout->close();/*Закрити файл*/
delete fout;/*Видалити потік*/
std::cout.rdbuf(backup);/*Відновити потік що виводить в консоль*/
std::cout<<"Console";/*Перевірка*/
return 0;
}
В деяких випадках це дуже допомагає, а то я думав передавати посилання на ofstream у всі класи.