首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在调用std::getline之前检查数据可用性

在调用std::getline之前检查数据可用性
EN

Stack Overflow用户
提问于 2010-07-23 19:35:37
回答 6查看 16.4K关注 0票数 27

我想从使用std::getline的流中读取一些数据。下面是一个使用std::cin的示例。

代码语言:javascript
复制
std::string line;
std::getline( std::cin, line );

这是一个阻塞函数,即如果没有要读取的数据或行,就会阻塞执行。

您是否知道在调用std::getline之前是否有检查数据可用性的函数?我不想阻塞。

如何检查流缓冲区中是否充满了成功调用std::getline所需的有效数据

不管下面的代码是什么样子的

代码语言:javascript
复制
if( dataAvailableInStream() )
{
     std::string line;
     std::getline( std::cin, line );
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-23 21:18:08

iostream库不支持非阻塞I/O的概念。我不认为C++标准中有任何支持非阻塞I/O的概念。任何好的解决方案都可能是特定于平台的。如果可以使用POSIX库,可以研究一下select。它通常用于网络方面,但如果您将stdin的文件描述符传递给它,它将工作得很好。

票数 8
EN

Stack Overflow用户

发布于 2010-07-23 21:15:22

没有标准的方法来验证getline是否会阻塞。您可以使用:

代码语言:javascript
复制
std::cin.rdbuf()->in_avail()

要查看在读操作可能阻塞之前有多少字符肯定是可用的,但是在重新检查in_avail之前,您必须逐个读取字符,因为没有办法提前知道任何挂起的字符是换行符还是流的实际结尾。如果不是这样,getline调用可能会阻塞。

请注意,尽管如果in_avail()返回一个正数,则可以保证在流结束之前至少有那么多字符可用,反之亦然。如果in_avail()返回零,则可能仍有可用的字符,并且流可能不会立即阻塞。

票数 18
EN

Stack Overflow用户

发布于 2017-05-05 23:13:34

此代码可以帮助您在不阻塞的情况下检查stdin中是否存在数据:

代码语言:javascript
复制
std::cin.seekg(0, std::cin.end);
int length = std::cin.tellg();
if (length < 0) return; //- no chars available

如果stdin有一些数据-不要忘记将位置设置回开头。

代码语言:javascript
复制
std::cin.seekg(0, std::cin.beg);

然后,您可以读取缓冲区末尾的所有数据,包括\0 (可以是多个):

代码语言:javascript
复制
std::vector<char> s(length);
std::cin.read(s.data(), length);

或逐行:

代码语言:javascript
复制
std::string line;
while (std::cin) {
    std::getline(std::cin, line);
    //.....
}

此代码可在MSVC和gcc (Ubuntu)中运行

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3317740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档