Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.64
Zizzi
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
#1

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

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

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

В Delphi это делалось просто - rewrite(output, "output.txt")
А в С++, что-то никак не могу. Подскажите, кто знает, пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
19.11.2009, 16:07     Переопределить поток вывода cout #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);
Zizzi
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
19.11.2009, 16:17  [ТС]     Переопределить поток вывода cout #3
2 zim22
Спасибо! Как раз то что нужно
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
19.11.2009, 16:38     Переопределить поток вывода cout #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*
Zizzi
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
20.11.2009, 16:28  [ТС]     Переопределить поток вывода cout #5
Тоже интересный способ, спасибо)
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
20.11.2009, 17:43     Переопределить поток вывода cout #6
Цитата Сообщение от Zizzi Посмотреть сообщение
Тоже интересный способ, спасибо)
Я бы сказал, что он более правильный. Но с Си++ не дружу, а потому так не скажу, ибо не знаю, как там все эти классы ostream и ofstream устроены
M128K145
Эксперт C++
 Аватар для M128K145
8277 / 3496 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
20.11.2009, 18:48     Переопределить поток вывода cout #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";
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
20.11.2009, 19:23     Переопределить поток вывода cout #8
> Для того чтобы выводить еще и на экран достаточно подключить iostream и выводить

А если в тридцати местах есть печать, то все тридцать мест править?
M128K145
Эксперт C++
 Аватар для M128K145
8277 / 3496 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
20.11.2009, 20:11     Переопределить поток вывода cout #9
Цитата Сообщение от Evg Посмотреть сообщение
А если в тридцати местах есть печать, то все тридцать мест править?
А для чего что-то править? Если надо все просто перенаправить в файл, то править ничего не надо или я просто не понял вопрос
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
20.11.2009, 20:21     Переопределить поток вывода cout #10
M128K145, так я и советовал на хабре недавно =)
А то в одном топике, создали класс, который занимается перенаправлением и т.д. К чему муки?) В С++03 потому и спрятали объекты cout и cin в пространство имен std, чтоб не мешать создавать с такими имнами другие объекты.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2009, 00:05     Переопределить поток вывода cout
Еще ссылки по теме:

Нюансы ввода/вывода в Си и C++ (функция printf() и объект std::cout) C++
C++ Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout
Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout C++
Ошибка в dll при обращении к потоку вывода cout C++ WinAPI
C++ формат вывода cout << hex

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,794
Записей в блоге: 26
21.11.2009, 00:05     Переопределить поток вывода cout #11
Цитата Сообщение от M128K145 Посмотреть сообщение
А для чего что-то править? Если надо все просто перенаправить в файл, то править ничего не надо или я просто не понял вопрос
Дошло
Yandex
Объявления
21.11.2009, 00:05     Переопределить поток вывода cout
Ответ Создать тему
Опции темы

Текущее время: 01:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru