我想从使用std::getline
的流中读取一些数据。下面是一个使用std::cin
的示例。
std::string line;
std::getline( std::cin, line );
这是一个阻塞函数,即如果没有要读取的数据或行,就会阻塞执行。
您是否知道在调用std::getline
之前是否有检查数据可用性的函数?我不想阻塞。
如何检查流缓冲区中是否充满了成功调用std::getline
所需的有效数据
不管下面的代码是什么样子的
if( dataAvailableInStream() )
{
std::string line;
std::getline( std::cin, line );
}
发布于 2010-07-23 21:18:08
iostream
库不支持非阻塞I/O的概念。我不认为C++标准中有任何支持非阻塞I/O的概念。任何好的解决方案都可能是特定于平台的。如果可以使用POSIX库,可以研究一下select
。它通常用于网络方面,但如果您将stdin的文件描述符传递给它,它将工作得很好。
发布于 2010-07-23 21:15:22
没有标准的方法来验证getline
是否会阻塞。您可以使用:
std::cin.rdbuf()->in_avail()
要查看在读操作可能阻塞之前有多少字符肯定是可用的,但是在重新检查in_avail
之前,您必须逐个读取字符,因为没有办法提前知道任何挂起的字符是换行符还是流的实际结尾。如果不是这样,getline
调用可能会阻塞。
请注意,尽管如果in_avail()
返回一个正数,则可以保证在流结束之前至少有那么多字符可用,反之亦然。如果in_avail()
返回零,则可能仍有可用的字符,并且流可能不会立即阻塞。
发布于 2017-05-05 23:13:34
此代码可以帮助您在不阻塞的情况下检查stdin
中是否存在数据:
std::cin.seekg(0, std::cin.end);
int length = std::cin.tellg();
if (length < 0) return; //- no chars available
如果stdin
有一些数据-不要忘记将位置设置回开头。
std::cin.seekg(0, std::cin.beg);
然后,您可以读取缓冲区末尾的所有数据,包括\0
(可以是多个):
std::vector<char> s(length);
std::cin.read(s.data(), length);
或逐行:
std::string line;
while (std::cin) {
std::getline(std::cin, line);
//.....
}
此代码可在MSVC和gcc (Ubuntu)中运行
https://stackoverflow.com/questions/3317740
复制相似问题