Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
1

Переопределить поток вывода cout

19.11.2009, 15:00. Просмотров 8489. Ответов 10
Метки нет (Все метки)


Есть некоторый кусок кода выводящий на консоль информацию с помощью cout, все бы хорошо, но при некоторых условиях, бывает нужно выводить эту инфу в файл. Хотелось бы без дублирования кода, провести эту операцию, то есть вывести в файл, с помощью cout. Реально ли это?
Файл использую - ofstream fout("output.txt");

В Delphi это делалось просто - rewrite(output, "output.txt")
А в С++, что-то никак не могу. Подскажите, кто знает, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2009, 15:00
Ответы с готовыми решениями:

Как создать виртуальный поток и переопределить оператор <<?
Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный. Впрочем, создание...

Зачем очищать поток cout?
Всем привет! Не могу понять, зачем очищать поток cout после вывода? Все, что выудил из гугла,...

Ошибка в dll при обращении к потоку вывода cout
друзья программисты, подскажите пожалуйста, как решить проблему с dll. Выдаёт ошибку в функции...

Как переопределить "operator <<" для cout?
использую RAD 2010 (MVS 2010 стал сильно тормозить и я перешёл). setlocale не помогает, функция ...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
10
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
19.11.2009, 16:07 2
Цитата Сообщение от Zizzi Посмотреть сообщение
гу. Подскажите, кто знает, пожалуйста.
C++
1
2
3
4
5
6
void fcn(ostream &out) {
  out << "yo";
}
fcn(std::cout);
std::ofstream out("file.txt");
fcn(out);
1
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
19.11.2009, 16:17  [ТС] 3
2 zim22
Спасибо! Как раз то что нужно
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
19.11.2009, 16:38 4
Я плохо знаю Си++, так что по сути могу ошибиться в интаксисе. Но смысл такой

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
 
int main (void)
{
#if 1
  std::ostream &out = std::cout;
#else
  std::ofstream out ("out.txt");
#endif
 
  out << "aaa\n";
 
  return 0;
}
Т.е. везде сохраняем синтаксис cout'а, ноработаем через переменную out, которую делаем либо копией cout'а, либо файлом. Указанный вариант работает как выдача на печать, если "#if 1" заменить на "#if 0", то будет в файл. Может кто-то знает, как более аккуратно переписать. Просто в Си стандартный вывод и работа с файлом строятся через один и тот же тип FILE*
2
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
20.11.2009, 16:28  [ТС] 5
Тоже интересный способ, спасибо)
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
20.11.2009, 17:43 6
Цитата Сообщение от Zizzi Посмотреть сообщение
Тоже интересный способ, спасибо)
Я бы сказал, что он более правильный. Но с Си++ не дружу, а потому так не скажу, ибо не знаю, как там все эти классы ostream и ofstream устроены
0
Эксперт JavaЭксперт С++
8365 / 3586 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
20.11.2009, 18:48 7
самый ленивый способ
C++
1
2
3
4
5
6
7
#include <fstream>
int main()
{
    std::ofstream cout("rezult.txt", std::ios::out);
    cout<<"some text";
    return 0;
}
Для того чтобы выводить еще и на экран достаточно подключить iostream и выводить
C++
1
std::cout<<"some text";
или, если подключено стандартное пространство имен std, то так
C++
1
::cout<<"some text";
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
20.11.2009, 19:23 8
> Для того чтобы выводить еще и на экран достаточно подключить iostream и выводить

А если в тридцати местах есть печать, то все тридцать мест править?
0
Эксперт JavaЭксперт С++
8365 / 3586 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
20.11.2009, 20:11 9
Цитата Сообщение от Evg Посмотреть сообщение
А если в тридцати местах есть печать, то все тридцать мест править?
А для чего что-то править? Если надо все просто перенаправить в файл, то править ничего не надо или я просто не понял вопрос
1
2808 / 1399 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
20.11.2009, 20:21 10
M128K145, так я и советовал на хабре недавно =)
А то в одном топике, создали класс, который занимается перенаправлением и т.д. К чему муки?) В С++03 потому и спрятали объекты cout и cin в пространство имен std, чтоб не мешать создавать с такими имнами другие объекты.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,469
Записей в блоге: 30
21.11.2009, 00:05 11
Цитата Сообщение от M128K145 Посмотреть сообщение
А для чего что-то править? Если надо все просто перенаправить в файл, то править ничего не надо или я просто не понял вопрос
Дошло
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2009, 00:05

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Как вывести номер итератора в стандартный поток cout
Есть пример решенный. Там необходимо ввести числа, cin их считывает и заносит в вектор, каждое...

Правила вывода cout
Вопрос небольшой. (Кому то сейчас вспомнится Прата.) Тема пожалуй заезжена и даже чувствую вину за...

формат вывода cout << hex
Все привет, имеется небольшая проблемка, не могу придумать как победить.. cout &lt;&lt; uppercase &lt;&lt;...

странный порядок вывода cout
Доброго времени суток. Есть шаблонный класс stack, и небольшая тестовая программка. Ожидаемый вывод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.