Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

Перевод стандартных потоков ввода/вывода в файлы

23.08.2010, 22:17. Показов 4033. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Интересует сея возможность.. Знаю про freopen с С файлами, но вот интересна такая возможность в С++. В книгах и сети написано типа такого:

C++
1
2
3
4
5
6
ofstream ofs;
// открыли файл
if(ofs)
{
cout=ofs;
}
Вполне неплохо. Но у меня так работать не хочет. Пробовал разными способами.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <fstream>
 
int main()
{
   std::ofstream f("input.txt");
   std::cout=f;
   //f>>a>>b;
   //of<<a+b;
   return 0;
}
Кидает такую ошибку:

Error 1 error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2010, 22:17
Ответы с готовыми решениями:

Перехват стандартных потоков ввода-вывода
Здравствуйте. Проблема вот в чем: Имеется файл code.exe, который ожидает ввода двух чисел и...

Перехват потоков ввода/вывода
Проблема в следующем: Имеется консольное приложение, например такое: //1.exe #include &lt;iostream&gt;...

Связывание потоков ввода-вывода
cin.tie(&amp;cout); cout&lt;&lt;&quot;Enter x: &quot;; cin&gt;&gt;x; для чего применяется связывание? а то чтот не...

Синхронизация потоков ввода и вывода в Eclipce CDT
Недавно перешел на программирование на Eclipse, но загвоздка в том, что если нужно ввести какое-то...

5
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
23.08.2010, 22:37 2
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
   ofstream f("output.txt");
   cout.rdbuf( f.rdbuf() );
   cout<<"Example";
   return 0;
}
3
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
23.08.2010, 22:41  [ТС] 3
Евгений М., Огромное спасибо!
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 04:24 4
Lavroff, не понял, чего именно ты хочешь. Если тебе нужно, чтобы в зависимости от ввода пользователя, к примеру, вывод шел в разные потоки, то тебе нужно использовать указатели на потоки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstdlib>
#include <fstream>
 
int main()
{
    std::ostream* p_os;
    std::ofstream logfile("log.txt");
    std::cout << "Output:\n1 - to stdout\n2 - to stderr\n3 - to logfile\n? ";
    char c;
    std::cin >> c;
    switch(c) // Выбираем поток, в который будем выводить данные
    {
    case '1':
        p_os = &std::cout; // Стандартный поток вывода
        break;
    case '2':
        p_os = &std::cerr; // Стандартный поток ошибок
        break;
    case '3':
        p_os = &logfile; // Файловый поток вывода
        break;
    default:
        std::cerr << "Unexpected character!" << std::endl;
        return EXIT_FAILURE;
    }
    // Вывод в выбранный поток:
    *p_os << "Example of an output" << std::endl;
    return EXIT_SUCCESS;
}
Евгений М., интересный пример, вижу в первый раз. А можно будет потом "восстановить" стандартный поток (чтобы в дальнейшем вывод производился в консоль)?
1
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
24.08.2010, 08:48 5
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    streambuf *backup;
    ofstream f("output.txt");
    backup = cout.rdbuf();
    cout.rdbuf( f.rdbuf() );
    cout << "File";
    
    cout.rdbuf( backup );
    cout << "Stdout";
    return 0;
}
3
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
24.08.2010, 09:35 6
Цитата Сообщение от Евгений М. Посмотреть сообщение
C++
1
2
3
streambuf *backup;
backup = cout.rdbuf();
cout.rdbuf( f.rdbuf() );
Можно так:
C++
1
streambuf* backup = cout.rdbuf( f.rdbuf() );
0
24.08.2010, 09:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2010, 09:35
Помогаю со студенческими работами здесь

GoogleTest. Тестирование потоков ввода/вывода для собственных классов
Доброго времени суток, форумчане! У меня есть класс, для которого я написал перегрузку оператора...

Проблема при замещении стандартных потоков ввода/вывода
Вместо замещения стандартных потоков ввода и вывода происходит обычный запуск программы...

Переопределение стандартных функций ввода/вывода
Доброго времени суток жители данного форума и гости ! Имеется задача сделать переопределение...

Перехват потоков ввода/вывода
Уже 2 дня бьюсь над проблемой: на основе примера...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru