Как очистить входной поток, получивший несколько входов в c?

Я пишу клиент-серверный проект с использованием протокола TCP, поэтому в моем клиентском коде у меня есть цикл while с read(), который ожидает записи() с сервера.

Я думаю, что это не имеет отношения к вопросу, который я на самом деле задаю, однако именно это вызывает мою проблему, заключающуюся в том, что, пока клиент ожидает записи () с сервера, пользователь может вводить предложения на терминале, которые получают помещаются во входной буфер, поэтому, когда мой клиент, наконец, получает write() и переходит от read(), я не могу очистить входной буфер обычным способом очистки каждого символа, пока не будет найден новый символ строки:

while (getchar() != '\n');

потому что пользователь набрал много предложений и несколько раз нажимал клавишу ввода, пока ждал.

Есть ли способ полностью очистить входной поток независимо от того, что в нем?

Все, что я узнал до сих пор, это то, что я могу использовать fflush(stdin), и, хотя это нетрадиционно, это работает для меня, но иногда это не так, поэтому я не могу его использовать.

Я также попытался проверить конец входного потока с помощью:

while (getchar() != '\0');

Но он застревает в бесконечном цикле. Я также пытался использовать scanf(), который игнорирует новые строки после read():

scanf("%[^\r\t\n]s", buf);

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

Наконец, я попытался возиться с fgets(), но и там не повезло.

P.S. Есть ли способ полностью отключить стандартный поток ввода перед вызовом read() и снова включить его сразу после?

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


person Devez    schedule 31.12.2014    source источник


Ответы (1)


Это кажется многообещающим: в основном то, что он / она делает, использует fgets с fflush.

https://www.daniweb.com/software-development/c/code/217396/how-to-properly-flush-the-input-stream-stdin

person Ibrar Yunus    schedule 31.12.2014