Как распечатать то, что в командной строке C - PullRequest
1 голос
/ 09 мая 2019

Чтобы построить чат, я должен отправлять и получать сообщения. В настоящее время я отправляю и получаю сообщения из командной строки. Когда я получаю сообщение, когда я его набираю, полученное сообщение печатается, и я не вижу, что было напечатано ранее. Я использую команду read(), чтобы перехватить ввод пользователя.

Вот пример:

Предположим, я хочу отправить сообщение Hello World и получить сообщение после ввода Hello Wor.

Вот что происходит:

$ Enter your message : Hello Wor
$ Somebody: This is a message 
$ Enter your message :

Но Hello Wor все еще находится в командной строке: если я нажму клавишу Delete, я увижу Hello Wo. Вот что я хочу:

$ Enter your message : Hello Wor
$ Somebody: This is a message 
$ Enter your message : Hello Wor

Я хотел бы сохранить напечатанное до печати полученного сообщения и распечатать его.

1 Ответ

1 голос
/ 09 мая 2019

Без использования API управления терминалом, такого как curses или ncurses, вам нужно будет изменить свою программу, чтобы она работала примерно так:

  1. Отключить локальное эхо, так что ваша программа обрабатывает каждое локальное нажатие до того, как будет обработано кареткой в ​​терминале.
  2. Ваш локальный код обработки нажатия клавиш должен быть асинхронным , поэтому он не блокируется на getchar во время ожидания ввода пользователем следующего символа своего сообщения или [Enter].
    • Это важно, чтобы ваша программа по-прежнему могла собирать и отображать сообщения, полученные на конце сети. Хотя вы могли бы использовать второй поток для этого, это означало бы, что два потока будут использовать stdio одновременно, что нецелесообразно, в то время как вы могли бы использовать примитивы синхронизации потоков, чтобы предотвратить эту ошибку, лучше использовать асинхронный API ввода-вывода вместо этого.
    • Важное замечание: «асинхронный» код не означает «одновременный» и не подразумевает использование многопоточности. На практике это означает, что поток программы вернется к центральному диспетчеру (совместное получение) вместо блокировки на IO, и диспетчер возобновит функцию, к которой он дал, после завершения операции IO (это то, что ключевое слово await делает в C # и JavaScript).
    • Однако в C работа с API асинхронного терминала / консоли в Linux - это PITA , и вам лучше использовать библиотеку типа ncurses, которая справится с этим.
  3. Когда ваша программа получает сообщение для отображения, вы должны очистить нижнюю строку окна (перезаписав ее пробелами или используя VT100 ^[[2K), написать полученное сообщение, а затем переписать неполный введенный пользователем ввод ( если есть) на новой строке.
  4. Повторите.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...