C ++清除输入缓冲区(最后没有换行符)

时间:2013-11-28 17:45:27

标签: c++ linux stdin cin

我有一台服务器使用select-accept处理多个客户端。

客户端可以连接并向服务器发送消息,服务器可以随时向任何客户端发送消息。 客户端使用accept来检查stdin和socket的消息。

假设两个客户端同时连接。第一个客户端开始向服务器键入消息,同时(在第二个客户端消息的结果中)服务器向第一个客户端发送消息。第一个客户端在换行符后立即显示服务器消息,从而中断控制台输入。然后第一个客户端重新输入消息并按Enter键,但问题是消息的未完成部分(在服务器消息到达之前输入)也被发送。

控制台上的可能结果:

./client
Server says: Hi Tom! Use commands get, set, exit.
Tom> exi
Server says: Your friend<Peter> arrived.
Tom> exit

在上面的示例中,客户端(Tom)尝试发送退出。

./server
Waiting connections...
Tom arrived.
Peter arrived. Notifying friends: Tom...
Tom -> exiexit

服务器获取exiexit而不是exit

问题是如何清理输入?我尝试了以下和组合:

std::cin.ignore(INT_MAX);
std::cin.ignore(INT_MAX, '\n');
while ((ch = getchar()) != '\n' && ch != EOF);
scanf("%c%*[^\n]%*c", &c);
std::getline(std::cin, buffer);
gets(buffer);
std::cin.sync();
std::cin.seekg(0, std::cin.end);

但主要问题是操作阻止所以我必须按Enter键,或者它不清理输入,或两者兼而有。

1 个答案:

答案 0 :(得分:1)

这在便携式C / C ++中并不容易。您需要做的是与终端进行更强烈的互动,以便您可以精确控制发生的事情。

在Linux上,例如,有一个ncurses库可以帮助你在终端中移动光标并逐个字符地读取而不需要行缓冲等。这将允许你在stdout上重新打印部分输入行,这样用户就可以看看实际发生了什么。对此的低级API是 termios (请参阅man 3 termios)。

在Windows上有类似的可能性,但有一个非常不同的界面,console familiy of functions

相关问题