当前位置:  开发笔记 > 编程语言 > 正文

如何在不阻塞输入的情况下使用getline?

如何解决《如何在不阻塞输入的情况下使用getline?》经验,为你挑选了1个好方法。

是否有任何方法可以调用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(),但是这也阻止了输入。



1> Sam Varshavc..:

您应该可以通过在标准输入文件描述符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::cinstreambuf,因为那会,很显然,抢占任何形式的poll()select()检查; 但是通过尝试从中读取内容std::cin,您仍然冒着读取缓冲数据的风险,然后尝试read()从现在处于非阻塞模式的基础文件描述符进行读取,这会导致伪造的文件结束条件。

总结:您需要花费更多的时间阅读和理解文件流以及流缓冲区的工作方式;文件描述符实际上如何工作,非阻塞模式如何工作;为了弄清楚您将需要使用的正确逻辑。

哦,如果您坚持使用std::cin和进行非阻塞路由getline(),您将没有简单的方法来确定字符串返回的字符串是否是getline()因为getline()实际上是从标准输入中读取换行符,还是到达了文件的过早伪造末尾条件,而不是实际上已经读取了整个输入行。

因此,在非阻塞模式and下std::cin,您将不得不使用read()而不是getline()

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有