2014-12-25 4 views
4

Ну, я пишу чат в C++ для использования в терминале linux. Я хочу получать сообщения даже во время ввода. в основном, неблокирующий cin. Мне удалось получить эту работу, создав поток. НО проблема в том, что входящие сообщения и мой ввод объединяются вместе.C++: cin while cout

Есть ли способ разделить cin линии от других линий, следующих от cout?

Извините за мой английский.

+1

a) Не использовать (несинхронизированные) потоки. б) Как насчет ввода «строка», а остальная часть консоли - это выходная часть? Для установки позиций курсора и т. Д. Помогать NCurses. – deviantfan

+2

Возможно, вы захотите взглянуть на что-то вроде этого: https://en.wikipedia.org/wiki/Ncurses – Galik

+1

Короткий ответ: 'cin' и' cout' непригодны для интерактивного ввода, они предназначены для чтения/записи к * потокам *, а не от пользователя. Следовательно, рекомендуется использовать что-то вроде ncurses, которое является библиотекой для интерактивного ввода пользователем. –

ответ

5

Есть ли способ разделить cin линии от других линий, следующих от cout?

Да, но это немного сложно: вам нужно отключить эхо для консоли и напечатать символы, введенные конечным пользователем по мере их ввода.

При обнаружении входящего сообщения, вы должны сделать эти три вещи:

  • очистить все символы в строке конечный пользователь вошел до сих пор
  • Печать входящего сообщения
  • Распечатайте символы, введенные до сих пор на следующей строке.

Конечный результат будет выглядеть следующим образом:

Friend: How are you?      <== This is your friend's prior message 
You: > I am fi        <== This is the text you've entered so far 

Когда следующее сообщение приходит, прежде чем вы закончите печатать, вы переставить последние строки следующим образом:

Friend: How are you?      <== This is your friend's prior message 
Friend: Are you coming to school tomorrow? <== This is the new line that came in as the user was typing 
You: > I am fi        <== This is the text you've entered so far, re-printed again 
+0

Пока это лучший ответ. Это помогло мне понять. Спасибо! – Ikbel

3

Мои Идея состоит в том, чтобы хранить сообщение неполного клиента (которое еще не было отправлено) в переменной и когда программа получает входящие сообщения, она должна удалять сообщение клиента с помощью обратных пространств, записывать входящее сообщение в cout, а затем переписывать неполную мессу клиента GE.

Я еще не проверил его.

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