Как я могу приостановить свою программу C, когда страница консоли была напечатана? - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю над базовым SIC-ассемблером, и одна из функций, которые я пытаюсь реализовать, заключается в том, что во время выполнения функции дампа, если программа генерирует больше, чем страницу текста на консоли, она будет запрашивать пользователячтобы продолжить, нажмите клавишу.

Моя функция дампа считывает шестнадцатеричные значения диапазона адресов в памяти.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В системах POSIX самый простой способ - передать данные через more.Или в системах, которые его имеют, less.

FILE *outfd = popen("less", "w"); и используйте его вместо stdout.popen(3) определяется POSIX.Так же и more, но вы можете сначала попробовать less.Или лучше: используйте getenv("PAGER"), прежде чем вернуться к more.

Пусть другая программа выяснит обработку терминала и все это вместо того, чтобы пытаться свернуть свою собственную.

Некоторые не POSIX-системы, такие как Windows, также имеют программы пейджера, которые вы можете использовать.Я думаю, что в Windows даже есть программа more, но IDK, если она имеет функцию popen в любой стандартной библиотеке за пределами cygwin.


Чтобы перенаправить stdout в канал, вы можете использоватьболее низкоуровневые функции POSIX, такие как dup2 (ищите в SO примеры).

Но я не думаю, что вы можете сделать это в основном с помощью всего лишь popen.В библиотеке GNU C (glibc) вы можете назначить stdout, например, stdout = popen(...);

Но другие реализации C могут не поддерживать это: stdout может быть макросом, который не поддерживает назначениек.( См. Страницу стандартных потоков руководства glibc .)

0 голосов
/ 04 декабря 2018

Сначала вам нужно определить, что такое «страница».Тогда вы узнаете, сколько строк доступно.Затем при печати вы прекращаете получать ввод через каждые X строк (где X - количество строк на странице), прежде чем продолжить печать следующих X строк.

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

...