Потоковая передача всего блока кода в текстовый файл на C ++ - PullRequest
2 голосов
/ 31 декабря 2011

Я не знаю, возможно ли это сделать.Я хотел бы сохранить выходные данные различных частей программы таким образом, чтобы я загружал сохраненные данные и отображал их в точности так, как они были напечатаны в первую очередь.

Я знаю, что это возможно сделать простым способом, но мне просто интересно, есть ли очень простой способ сделать это и добавить в существующую программу.Было бы хорошо, если бы я мог просто указать область кода, в которой весь вывод, который выводится на экран, также вставляется в текстовый файл и сохраняется.Есть ли какая-нибудь библиотека бустов, на которую мне стоит взглянуть?

1 Ответ

4 голосов
/ 31 декабря 2011

Вы можете создать буфер потока, который записывает в несколько других потоков, и установить его в std::cout. По сути, это выглядит примерно так:

#include <streambuf>
struct teebuf:
    std::streambuf
{
    teebuf(std::streambuf* sb0, std::streambuf* sb1): sb0_(sb0), sb1_(sb1) {}
    int_type overflow(int_type c) {
        this->sb0_->sputc(c);
        this->sb1_->sputc(c);
        return traits_type::not_eof(c);
    }
    int sync() {
         this->sb0_->pubsync();
         this->sb1_->pubsync();
         return 0;
    }
    std::streambuf* sb0_;
    std::streambuf* sb1_;
};

#include <iostream>
#include <fstream>
int main() {
    std::ofstream   file("file.log");
    teebuf          tee(std::cout.rdbuf(), file.rdbuf());
    std::streambuf* orig(std::cout.rdbuf());
    std::cout.rdbuf(&tee);
    std::cout << "hello, world!\n";
    std::cout.rdbuf(orig);
}

Для получения более подробной информации о том, как это работает, вы можете взглянуть на статьи, которые я написал на эту тему в comp.lang.c ++ и comp.lang.c ++. Moderated (было несколько статей, более десятилетие ...).

...