Страницы

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

вторник, 19 марта 2019 г.

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

Разбираю файл в массив с помощью 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); удалять вопрос не буду, может кому пригодится.


Ответ

Давайте-ка я вынесу из комментариев.
Вам нужно поменять функцию 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

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

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