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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.08.2010, 22:17     Перевод стандартных потоков ввода/вывода в файлы #1
Интересует сея возможность.. Знаю про 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>'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2010, 22:17     Перевод стандартных потоков ввода/вывода в файлы
Посмотрите здесь:

Рассчитать значения выражений используя для ввода и вывода текстовые файлы C++
C++ Текстовые файлы и потоки ввода/вывода
Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключи C++
Перехват потоков ввода/вывода C++
Перевод потока из файлового ввода/вывода в консольный ввод/вывод C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.08.2010, 22:41  [ТС]     Перевод стандартных потоков ввода/вывода в файлы #3
Евгений М., Огромное спасибо!
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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;
}
Евгений М., интересный пример, вижу в первый раз. А можно будет потом "восстановить" стандартный поток (чтобы в дальнейшем вывод производился в консоль)?
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
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;
}
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 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() );
Yandex
Объявления
24.08.2010, 09:35     Перевод стандартных потоков ввода/вывода в файлы
Ответ Создать тему
Опции темы

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