是否有任何方法可以调用getline()
,如果没有输入,就不会阻塞并等待?
我有以下代码:
while(true){ if(recv(sd, tBuffer, sizeof(tBuffer), MSG_PEEK | MSG_DONTWAIT) > 0) break; getline(cin,send); }
我想等待输入,但是如果我在sd
套接字处接收到一些数据,我想停止等待数据并退出while
。我的代码现在停留在的第一次迭代中getline()
。我要评估getline()
,如果没有可用的输入,请返回if
。
这可能吗?
PS:我尝试过使用cin.peek()
,但是这也阻止了输入。
您应该可以通过在标准输入文件描述符0上设置非阻塞模式来做到这一点:
int flags = fcntl(0, F_GETFL, 0); fcntl(0, F_SETFL, flags | O_NONBLOCK);
现在,如果没有可用的输入,则基础read()
系统调用将返回0,并std::cin
认为这是文件结尾,并设置为eof()
on std::cin
。
当您希望再次从标准输入中读取时,只需输入clear()
流的状态。
唯一复杂的因素是,这使得很难检测到上的实际文件结束条件std::cin
。当标准输入是交互式终端时,没什么大问题;但是如果标准输入可以是一个文件,那将是一个问题。
在这种情况下,您唯一可行的选择是std::cin
完全放弃,将非阻塞模式置于文件描述符0 poll()
或select()
它上,以确定何时需要读取某些内容,然后再进行读取read()
。
虽然你也可以使用poll()
或select()
与std::cin
,这会变得复杂,因为你需要明确检查是否有在已经缓冲什么std::cin
的streambuf
,因为那会,很显然,抢占任何形式的poll()
或select()
检查; 但是通过尝试从中读取内容std::cin
,您仍然冒着读取缓冲数据的风险,然后尝试read()
从现在处于非阻塞模式的基础文件描述符进行读取,这会导致伪造的文件结束条件。
总结:您需要花费更多的时间阅读和理解文件流以及流缓冲区的工作方式;文件描述符实际上如何工作,非阻塞模式如何工作;为了弄清楚您将需要使用的正确逻辑。
哦,如果您坚持使用std::cin
和进行非阻塞路由getline()
,您将没有简单的方法来确定字符串返回的字符串是否是getline()
因为getline()
实际上是从标准输入中读取换行符,还是到达了文件的过早伪造末尾条件,而不是实际上已经读取了整个输入行。
因此,在非阻塞模式and下std::cin
,您将不得不使用read()
而不是getline()
。