Как читать с клавиатуры, когда стандартный ввод установлен в файл на C

Я думаю, что это просто, но не для меня, очевидно!

У меня есть консольное приложение. Мне нужно прочитать ввод с клавиатуры, но stdin был перенаправлен в файл. Итак, как мне создать FILE-Handle, указывающий на поток клавиатуры, который я могу использовать с fgets и т. д.?

Я обнаружил, что ttyname(0) кажется тем, что я ищу в POSIX-среде, которой у меня здесь нет. Я в системе Windows со стандартным компилятором Visual Studio.

Любые идеи? Заранее спасибо.


person Sascha Leyer    schedule 05.10.2012    source источник
comment
Функция ttyname не помогла бы в среде POSIX, поскольку она возвращала бы NULL, когда ввод поступает из канала или перенаправленного файла.   -  person Some programmer dude    schedule 05.10.2012
comment
stdin has been redirected to a file. - почему бы вам не использовать fclose этот указатель файла и freopen стандартный ввод для нового файла. Как только вы закончите, снова перенаправьте стандартный ввод в старый файл.   -  person nav_jan    schedule 05.10.2012
comment
В некотором смысле, это то, что я хочу сделать nav_jan, но если я не знаю путь к консоли, я не могу открыть ее с помощью fopen или freopen. Если бы у меня был этот путь, мне не нужно было бы перенаправлять stdin. Я мог бы просто создать еще один дескриптор для ввода с клавиатуры и использовать как файл, так и ввод с клавиатуры независимо друг от друга. Но спасибо за мысль.   -  person Sascha Leyer    schedule 05.10.2012


Ответы (2)


Нет простого/портативного способа узнать, существует ли клавиатура (ваше приложение может запускаться из эмулятора терминала через последовательный порт, сеанс telnet или что-то еще). Если клавиатура действительно существует (включая изображение клавиатуры на сенсорном экране), то вы не можете точно сказать, через сколько уровней программного обеспечения должны пройти нажатия клавиш, прежде чем они попадут в ваше приложение (например, нажатия клавиш могут идти от от драйвера клавиатуры к редактору методов ввода, к графическому интерфейсу, к оболочке, к вашему приложению). Это означает, что попытка получить нажатия клавиш непосредственно из драйвера клавиатуры или чего-то еще — плохая идея, которая потерпит неудачу почти во всех случаях.

Лучший способ решить вашу проблему — выяснить, какая серия ошибок проектирования привела к перенаправлению STDIN в первую очередь.

Например; возможно, у приложения должна была быть опция командной строки для чтения некоторых данных из файла; так что приложение может получить некоторые данные из файла и некоторые из STDIN (и получить все данные из STDIN, если опция командной строки отсутствует).

person Brendan    schedule 05.10.2012

Взято из темных темных дней программирования для DOS: попробуйте открыть «CON:» (Консоль), зарезервированное слово. Надеюсь, он будет открываться так же в Windows. Двоеточие может быть или не быть обязательным. И «dir > con:», и «dir > con» по-прежнему работают в командной строке.

Кроме того, не забудьте использовать что-то из семейства setbuf() в дескрипторе вывода, чтобы избежать буферизации... он не должен буферизовать терминальный ввод-вывод, но никогда не помешает быть уверенным.

Опять же, не уверен, но я подозреваю, что открытие отдельных FILE *conin, *conout для вывода и одного для ввода может помочь, если у вас возникнут проблемы с одним дескриптором, выполняющим как ввод, так и вывод.

person Gilbert    schedule 05.10.2012