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

C++

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

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

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

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

В Delphi это делалось просто - rewrite(output, "output.txt")
А в С++, что-то никак не могу. Подскажите, кто знает, пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2009, 15:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переопределить поток вывода cout (C++):

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

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

Форматный вывод с помощью cout - C++
У меня простой вопрос. В си есть такая функция printf. Что-бы вывести дробное число k без всяких там E можно написать printf(&quot;%f&quot;,k)....

Класс log, выводящий в cout и в syslog - C++
Для логгирования в Linux-системе (для самого вопроса это не важно) хочу использовать свой класс с перегруженным operator&lt;&lt;(). Лог должен...

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток)) - C++ Builder
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))

Как переопределить метод родителя класса? - C++ Builder
Есть класс TDot, который есть классом-наследником для класса TTriangle В классе TDot есть метод setColor(), который меняет цвет и метод...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zim22
depict1
276 / 141 / 2
Регистрация: 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
Zizzi
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
19.11.2009, 16:17  [ТС] #3
2 zim22
Спасибо! Как раз то что нужно
0
Evg
Эксперт CАвтор FAQ
17823 / 6033 / 388
Регистрация: 30.03.2009
Сообщений: 16,563
Записей в блоге: 26
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
Zizzi
0 / 0 / 0
Регистрация: 28.02.2009
Сообщений: 5
20.11.2009, 16:28  [ТС] #5
Тоже интересный способ, спасибо)
0
Evg
Эксперт CАвтор FAQ
17823 / 6033 / 388
Регистрация: 30.03.2009
Сообщений: 16,563
Записей в блоге: 26
20.11.2009, 17:43 #6
Цитата Сообщение от Zizzi Посмотреть сообщение
Тоже интересный способ, спасибо)
Я бы сказал, что он более правильный. Но с Си++ не дружу, а потому так не скажу, ибо не знаю, как там все эти классы ostream и ofstream устроены
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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
17823 / 6033 / 388
Регистрация: 30.03.2009
Сообщений: 16,563
Записей в блоге: 26
20.11.2009, 19:23 #8
> Для того чтобы выводить еще и на экран достаточно подключить iostream и выводить

А если в тридцати местах есть печать, то все тридцать мест править?
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
20.11.2009, 20:11 #9
Цитата Сообщение от Evg Посмотреть сообщение
А если в тридцати местах есть печать, то все тридцать мест править?
А для чего что-то править? Если надо все просто перенаправить в файл, то править ничего не надо или я просто не понял вопрос
1
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
20.11.2009, 20:21 #10
M128K145, так я и советовал на хабре недавно =)
А то в одном топике, создали класс, который занимается перенаправлением и т.д. К чему муки?) В С++03 потому и спрятали объекты cout и cin в пространство имен std, чтоб не мешать создавать с такими имнами другие объекты.
0
Evg
Эксперт CАвтор FAQ
17823 / 6033 / 388
Регистрация: 30.03.2009
Сообщений: 16,563
Записей в блоге: 26
21.11.2009, 00:05 #11
Цитата Сообщение от M128K145 Посмотреть сообщение
А для чего что-то править? Если надо все просто перенаправить в файл, то править ничего не надо или я просто не понял вопрос
Дошло
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2009, 00:05
Привет! Вот еще темы с ответами:

Как переопределить методы компонента, обрабатывающие события OnMouseEnter, OnMouseLeave - C++ Builder
У многих компонентов есть события OnMouseEnter, OnMouseLeave, но нет методов, которые эти события обрабатывают. По аналогии событие OnClick...

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

Переопределить ToString для вывода всех элементов коллекции - C#
Не знаю правильное ли название темы.В общем.Есть коллекция А которая содержит экземпляры класса b хочу вывести эту коллекцию в listbox....

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.11.2009, 00:05
Ответ Создать тему
Опции темы

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