1 Востаннє редагувалося Betterthanyou (04.03.2018 23:43:06)

Тема: [не питання]Буфер потоку

В мене було багато класів які виводили інформацію (результат їхньої роботи) в консоль, але згодом мені потрібно було вивести всю інформацію у файл.
Це можна зробити за допомогою команди ">" 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 у всі класи.

Прихований текст

Звичайно, я розумію, що нічого нового не розказав для тих хто добре знає потоки, але для мене така можливість була "нова"

Подякували: sensei1