Russian Qt Forum
Ноябрь 18, 2024, 11:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: freopen и работа с ним  (Прочитано 4619 раз)
Remuless
Гость
« : Июнь 26, 2013, 19:25 »

добрый день.
возник следующий вопрос, с которым не могу никак разобраться:
открываю файл при помощи freopen:

freopen("input1.txt", "r", stdin);

читаю из него все что нужно.
после этого мне необходимо открыть следующий файл на чтение. и тут возникает моя проблема:
не важно, пытаюсь я просто открыть новый файл в этот же поток, или же сначала закрываю его при помощи fclose(stdin) и затем снова открываю.
чтение из второго и последующих файлов не происходит. подскажите, как можно исправить данную проблему?
Записан
Bepec
Гость
« Ответ #1 : Июнь 26, 2013, 19:58 »

В далёкой далёкой стране жил мудрец, знающий обо всём на свете, в том числе и об программах. И приходили к нему люди и спрашивали. Всем он отвечал одно и то же. Никто не получал ответа, а получали лишь пару слов, одинаковых для всех. И вот однажды человек не просто услышал слова, но и выполнил их. И тогда получил он ответ на свой вопрос, подробный и с комментариями. А та пара слов передавалась детям этого человека и внукам. И знаменем этого рода стали слова "приложи код и получишь ответ".
Записан
Remuless
Гость
« Ответ #2 : Июнь 26, 2013, 20:07 »

Код:
freopen("input1.txt", "r", stdin);
    int i = 0;
    while (cin >> buying1[i] >> selling1[i])
    {
        index1[i]=i;
        i++;
    }
    cout << "--------------------------------" << endl;

    maxIndex1 = i;
    fclose(stdin);
    freopen("input2.txt", "r", stdin);
    i = 0;
    while (cin >> buying2[i] >> selling2[i])
    {
        index2[i]=i;
        i++;
    }
    cout << "--------------------------------" << endl;

    maxIndex2 = i;
    fclose(stdin);
    freopen("input3.txt", "r", stdin);
    i = 0;
    while (cin >> buying3[i] >> selling3[i])
    {
        index3[i]=i;
        i++;
    }
    cout << "--------------------------------" << endl;
    maxIndex3 = i;
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 26, 2013, 21:27 »

может дело в смешивании сишных и плюсовых файловых потоков?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Remuless
Гость
« Ответ #4 : Июнь 26, 2013, 21:30 »

может дело в смешивании сишных и плюсовых файловых потоков?

ну первый то файл он читает нормально?
и, если проблема в этом, то ваше предложение, как исправить проблему?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июнь 26, 2013, 21:40 »

Попробуйте проверять возвращаемое значение и errno в случае ошибки.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Июнь 26, 2013, 23:34 »

и, если проблема в этом, то ваше предложение, как исправить проблему?
читать с помощью fread/fscanf, а не cin.

хотя вот тут написано, что проблем со смешиванием не должно быть: http://stackoverflow.com/questions/5257509/freopen-equivalent-for-c-streams
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fat-Zer
Гость
« Ответ #7 : Июнь 27, 2013, 02:50 »

во-первых, fclose() лишние [но не очень существенно]
во-вторых, достижение eof'а в потоке сохраняется в плюсовом потоке и надо вызвать cin.clear().

ЗЫ: надо помнить, что всё это лишь грязный хак, зависящий от реализации...
Записан
Remuless
Гость
« Ответ #8 : Июнь 27, 2013, 03:44 »

во-первых, fclose() лишние [но не очень существенно]
во-вторых, достижение eof'а в потоке сохраняется в плюсовом потоке и надо вызвать cin.clear().

ЗЫ: надо помнить, что всё это лишь грязный хак, зависящий от реализации...

благодарю, cin.clear() полностью решил проблему.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.