ofstream — Могу ли я перенаправить & quot; cout & quot; в файл?

Я просто хотел знать, есть ли способ сделать это:

ofstream exemple (name);
exemple << Display();

Display () является пустым методом, который делает только что-то подобное:

cout << "Something" << endl;

Я сделал бы это, потому что я уже написал все методы Display () для каждого класса, и я хотел бы поместить то, что они посылают cout в мой файл, или воссоздать некоторые методы «string Display ()».

Является ли это возможным?

Спасибо! Marco

0

Решение

Ты можешь измениться coutбуфер, но cout является глобальной переменной, которая влияет на всю программу.

Почему ты не делаешь Display() получить выходной поток в качестве параметра?

void Display(std::ostream &cout) {
cout << "Something" << endl;
}
5

Другие решения

Нет, не так. Вы не можете использовать результат void функционировать всегда, потому что у него его нет.

Это является можно взломать с помощью основного буфера std::coutменяя его на exampleх, но Я бы не рекомендовал это… и код в вашем вопросе все равно будет недействительным.

Вы могли бы сделать это:

#include <ostream>
#include <fstream>

void Display(std::ostream& os)
{
os << "Something" << std::endl;
}

int main()
{
const std::string name = "someFile.txt";
std::ofstream example(name);
Display(example);
}
4

Ты можешь сделать Display вспомогательная функция манипулятора display_msgкласс, который инкапсулирует вывод. Display не может вернуться void, потому что если вы ищете синтаксис os << Display() работать, Display придется вернуть что-то кроме void,

Вот определение display_msg:

class display_msg { };

Класс оставлен пустым, потому что он не выполняет ничего важного. Мы перегрузим оператор вставки для этого класса, чтобы мы могли получить доступ к выходному потоку и вставить наши пользовательские данные в:

std::ostream& operator<<(std::ostream& os, const display_msg&)
{
return os << "My message";
}

Это очень простая настройка. Но, как вы сказали, вы бы хотели, чтобы вывод был перенаправлен на стандартный вывод ( std::cout ). Для этого вам придется скопировать буфер std::cout в файловый поток. Вы можете сделать это, используя RAII (для управления зависимостями между объектами на протяжении жизни):

struct copy_buf
{
public:
copy_buf(std::ios& lhs, std::ios& rhs)
: str(lhs), buf(lhs.rdbuf())
{
lhs.rdbuf(rhs.rdbuf());
}

~copy_buf() { str.rdbuf(buf); }
private:
std::ios& str;
std::streambuf* buf;
};

Устройство вставки может использовать это так:

std::ostream& operator<<(std::ostream& os, const display_msg&)
{
copy_buf copy(os, std::cout);
return os << "My message";
}

Display простая вспомогательная функция, которая возвращает класс:

display_msg Display()
{
return display_msg();
}

std::ifstream f("in.txt");
f << Display(); // redirects to standard output
1
По вопросам рекламы [email protected]