Я просто хотел знать, есть ли способ сделать это:
ofstream exemple (name);
exemple << Display();
Display () является пустым методом, который делает только что-то подобное:
cout << "Something" << endl;
Я сделал бы это, потому что я уже написал все методы Display () для каждого класса, и я хотел бы поместить то, что они посылают cout в мой файл, или воссоздать некоторые методы «string Display ()».
Является ли это возможным?
Спасибо! Marco
Ты можешь измениться cout
буфер, но cout
является глобальной переменной, которая влияет на всю программу.
Почему ты не делаешь Display()
получить выходной поток в качестве параметра?
void Display(std::ostream &cout) {
cout << "Something" << endl;
}
Нет, не так. Вы не можете использовать результат 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);
}
Ты можешь сделать 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