Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Использовал freopen для stdin, как связать стандартный поток ввода обратно с консолью?

#cpp #c


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

    bool LoadData(const string &fn)
    {
        bool stat(0);
        if ( freopen(fn.c_str(), "r", stdin) )
        {
            stat = 1;
            ...

        }
        fclose (stdin);
        return stat;
    }


    int main()
    {
        ...
        LoadData(fn);
        ...
        cin >> s; // это не работает
        ...
        system ("pause"); // это тоже не работает т.к. завязано на stdin
        return 0;
    }


Вообщем решение для windows: freopen("CON", "r", stdin);
удалять вопрос не буду, может кому пригодится.
    


Ответы

Ответ 1



Давайте-ка я вынесу из комментариев. Вам нужно поменять функцию LoadData так, чтобы она читала не из stdin, а из данного файла. bool LoadData(const string &fn, Dup &tmp) { tmp = {0,0,0,0,"",fn}; bool stat(0); // if ( freopen(fn.c_str(), "r", stdin) ) FILE* f = fopen(fn.c_str(), "r"); if (f) { плюс поменяйте везде getchar() на getc(f), плюс в конце fclose(stdin) на fclose(f). Ещё по коду: вы совершенно зря объявили char t = getchar(); Дело в том, что getchar (а также getc) возвращают для конца файла значение EOF, которое не равно ни одному из значений, помещающихся в char. В текущей версии кода, если вдруг значение (char)EOF встретится в файле, работа функции прекратится. Используйте int.

Ответ 2



Вообщем решение для windows: freopen("CON", "r", stdin);

Комментариев нет:

Отправить комментарий