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

freopen - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 83, средняя оценка - 4.75
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2011, 13:27     freopen #1
Из всех способов текстового ввода/вывода предпочитаю freopen из-за удобства отладки(лень каждый раз сворачивать студию и проверять файлы, а freopen можно просто закомментировать)
Сейчас столкнулся с проблемой, нужно вывести сначала в файл, и уже затем на экран.
Судя по описанию freopen закрывает текущий поток и открывает новый... Как можно открыть вывод в консоль заново?
Взято с http://www.cplusplus.com/reference/c...stdio/freopen/
C++
1
2
3
4
5
6
7
8
9
10
11
/* freopen example: redirecting stdout */
#include <stdio.h>
 
int main ()
{
  freopen ("myfile.txt","w",stdout);
  printf ("This sentence is redirected to a file.");
  fclose (stdout); //По идее здесь тоже надо написать freopen(консоль,"a",stdout);
  printf("This sentence must be redirected back to console");   //добавлено мною, ничего не выводит(ни в файл, ни в консоль)
  return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2011, 13:27     freopen
Посмотрите здесь:

Не находит freopen C++
Функция freopen(stdout) - "неверный дескриптор" C (СИ)
C# Аналог freopen("input.txt", "rt", stdin); в C#

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
13.05.2011, 16:02     freopen #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не слишком ясно, зачем такая необходимость, коль можно другой FILE создать и писать туда что хочешь...
Но если всё-таки очень хочется, то переоткрыть стандартный вывод в консоль( это применительно к Windows, в *nix'ах как - не знаю, может, по-другому как ) через freopen можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
/* freopen example: redirecting stdout */
#include <stdio.h>
 
int main ()
{
  freopen ("myfile.txt","w",stdout);
  printf ("This sentence is redirected to a file.");
  fclose (stdout);
  freopen("CON","w",stdout);
  printf("This sentence must be redirected back to console");
  return 0;
}
Добавлено через 8 минут
Можно и слегка по-другому, например, через POSIX функцию fdopen, она первым параметром принимает файловый дескриптор, в который можно подставить STDOUT_FILENO из unistd.h, чтобы перенаправить стандартный вывод обратно.
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
23.06.2011, 21:00     freopen #3
Столкнулся с такой же необходимостью (перенаправить поток сначала в файл, потом обратно), и вот в чем проблема: после того как поток перенаправлен на экран (
C++
1
freopen("CON","w",stdout);
) начинаются сложности с кодировкой - вместо русских букв некрасивые. Как это исправить, и главное - почему это происходит.

Добавлено через 2 минуты
И еще: кто-нибудь может попроще объяснить отличие freopen от fopen?
Спасибо заранее!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.06.2011, 21:11     freopen #4
Svid, freopen просто переводит вывод/ввод из/в поток в/из файла. а fopen открывает файл соответственно.

Добавлено через 5 минут
Юзайте fstream) Проще ведь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <fstream>
 
int main()
{
    std::ofstream ofs("our_file.txt");
    std::streambuf* our_buffer = std::cout.rdbuf(ofs.rdbuf());
    std::cout << "Write to file\n";
    std::cout.rdbuf(our_buffer);
    std::cout << "Write to stdout\n";
    ofs.close();
}
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
23.06.2011, 21:31     freopen #5
Пока еще не могу понять: проще или нет. Только сегодня начал разбираться с файловым вводом/выводом.
Конкретно: встал перед проблемой записи в файл неких данных. У Лафоре (по которому и изучаю) это выглядит так:
C++
1
2
3
4
5
ofstream outfile("fdata.txt");
outfile << '\n'
        << temp1
        << ' '  
        << temp2;
но это, так сказать, разовая запись - которая затирает предыдущую. Поэтому, когда я натолкнулся на перенаправление потока - мне показалось это проще.
А в Вашем примере мне вообще со многим придется разбираться
Yandex
Объявления
23.06.2011, 21:31     freopen
Ответ Создать тему
Опции темы

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