Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Remuless от Июнь 26, 2013, 19:25



Название: freopen и работа с ним
Отправлено: Remuless от Июнь 26, 2013, 19:25
добрый день.
возник следующий вопрос, с которым не могу никак разобраться:
открываю файл при помощи freopen:

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

читаю из него все что нужно.
после этого мне необходимо открыть следующий файл на чтение. и тут возникает моя проблема:
не важно, пытаюсь я просто открыть новый файл в этот же поток, или же сначала закрываю его при помощи fclose(stdin) и затем снова открываю.
чтение из второго и последующих файлов не происходит. подскажите, как можно исправить данную проблему?


Название: Re: freopen и работа с ним
Отправлено: Bepec от Июнь 26, 2013, 19:58
В далёкой далёкой стране жил мудрец, знающий обо всём на свете, в том числе и об программах. И приходили к нему люди и спрашивали. Всем он отвечал одно и то же. Никто не получал ответа, а получали лишь пару слов, одинаковых для всех. И вот однажды человек не просто услышал слова, но и выполнил их. И тогда получил он ответ на свой вопрос, подробный и с комментариями. А та пара слов передавалась детям этого человека и внукам. И знаменем этого рода стали слова "приложи код и получишь ответ".


Название: Re: freopen и работа с ним
Отправлено: Remuless от Июнь 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;


Название: Re: freopen и работа с ним
Отправлено: kambala от Июнь 26, 2013, 21:27
может дело в смешивании сишных и плюсовых файловых потоков?


Название: Re: freopen и работа с ним
Отправлено: Remuless от Июнь 26, 2013, 21:30
может дело в смешивании сишных и плюсовых файловых потоков?

ну первый то файл он читает нормально?
и, если проблема в этом, то ваше предложение, как исправить проблему?


Название: Re: freopen и работа с ним
Отправлено: Old от Июнь 26, 2013, 21:40
Попробуйте проверять возвращаемое значение и errno в случае ошибки.


Название: Re: freopen и работа с ним
Отправлено: kambala от Июнь 26, 2013, 23:34
и, если проблема в этом, то ваше предложение, как исправить проблему?
читать с помощью fread/fscanf, а не cin.

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


Название: Re: freopen и работа с ним
Отправлено: Fat-Zer от Июнь 27, 2013, 02:50
во-первых, fclose() лишние [но не очень существенно]
во-вторых, достижение eof'а в потоке сохраняется в плюсовом потоке и надо вызвать cin.clear().

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


Название: Re: freopen и работа с ним
Отправлено: Remuless от Июнь 27, 2013, 03:44
во-первых, fclose() лишние [но не очень существенно]
во-вторых, достижение eof'а в потоке сохраняется в плюсовом потоке и надо вызвать cin.clear().

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

благодарю, cin.clear() полностью решил проблему.