2016-07-31 2 views
-2

У меня есть исполняемый файл, который написан на C++ и я запустить его в cmd.exe на Windows,GetChar() обходной путь в C/C++ для того, чтобы перенаправить выход

Когда я запустить этот исполняемый файл и, глядя на источник код, я вижу, что используется функция getchar(). Программа просит пользователя «щелкнуть любую клавишу, чтобы продолжить», и я вижу, что getchar() называется так, что дозатор программы продолжается, пока пользователь не нажмет любую клавишу.

Моя проблема заключается в том, что вывод программы слишком долго, поэтому я хочу, чтобы перенаправить его в файл ... (с перенаправлением характером >)

Так что, когда я запускаю ехе, как это в cmd.exe:

prg > temp.txt 

программа застревает, я предполагаю, что его потому, что он ожидает ввода (я пытался нажав любую клавишу, но она доцент работы.)

Когда я запустить программу без перенаправления его в файл, все работает нормально, поэтому я нажимаю любую клавишу, когда p rompted ...

я бы просто стер все getchar() вызов, но НЕ МОГУ изменить исходный код, потому что я не имею все ресурсы для того, чтобы вновь собрать его.

Есть ли обходной путь к моей проблеме?

+1

Не уверен, что в Windows, но в Linux вы можете подключить вход к программе. – 4386427

+1

как было указано 4386427, на linux было бы «echo» k "| program> out_file ' Попробуйте что-то подобное в окнах (у меня нет окон atm) –

+0

@Avra Вы уверены, что он называет 'getchar', а не какую-то другую функцию, например [' _getch'] (https://msdn.microsoft. ком/EN-US/библиотека/078sfkak.aspx)? – anatolyg

ответ

1

getchar обычно использует буферизованный вход. То есть, с точки зрения пользователя, он не ждет какого-либо ключа, а ждет, пока пользователь нажмет . Введите.

Вы должны нажать Введите один раз за каждый getchar, что и в программе. Или же, в первый раз он getchar (хотя вы можете только догадываться, когда оно есть, потому что нет строки), введите длинную строку:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

После нажатия Enter, последующие 30 getchar вызовов получит a, следующий получит \n, а следующий будет висеть, ожидая большего ввода (но не будет приглашения).

Другой возможный способ, которым Вы могли бы заставить его работать: перенаправлять некоторый вклад в программу:

echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | prg > temp.txt 

Убедитесь, что у вас достаточно вход, чтобы удовлетворить все getchar звонки.

+0

Если я правильно понял, мне все равно нужно угадать, когда первый «getchar», а затем нажмите «enter» или просто нажмите «enter» на неопределенное время. – Raz

+1

@Avra. Поэтому программы, такие как 'yes' существуют' yes '' 'будут печатать бесконечные строки и использовать их в конвейере: 'yes '' | prg> temp.txt' – andlrc

+0

Ваше предложенное решение сработало !!! – Raz

Смежные вопросы