C++ 如何确定std::istream中有多少字节可用?
如果我想C++ 如何确定std::istream中有多少字节可用?,c++,boost,stl,istream,C++,Boost,Stl,Istream,如果我想read()将std::istream的内容放入一个缓冲区,我必须先找出有多少数据可用,才能知道缓冲区有多大。为了从istream中获取可用字节数,我目前正在做如下工作: std::streamsize available( std::istream &is ) { std::streampos pos = is.tellg(); is.seekg( 0, std::ios::end ); std::streamsize len = is.tellg()
read()
将std::istream
的内容放入一个缓冲区,我必须先找出有多少数据可用,才能知道缓冲区有多大。为了从istream中获取可用字节数,我目前正在做如下工作:
std::streamsize available( std::istream &is )
{
std::streampos pos = is.tellg();
is.seekg( 0, std::ios::end );
std::streamsize len = is.tellg() - pos;
is.seekg( pos );
return len;
}
同样,由于std::istream::eof()不是AFAICT的一个非常有用的基础,为了确定istream
的get指针是否位于流的末尾,我将执行以下操作:
bool at_eof( std::istream &is )
{
return available( is ) == 0;
}
我的问题:
是否有更好的方法从
istream
获取可用字节数?如果不在标准库中,可能在boost中?对于std::cin
,您不需要担心缓冲,因为它已经被缓冲了,而且您无法预测用户笔划了多少个键
对于打开的二进制文件std::ifstream
,也会被缓冲,您可以调用seekg(0,std::ios:end)
和tellg()
方法来确定有多少字节
阅读以下内容后,还可以调用gcount()
方法:
char buffer[SIZE];
while (in.read(buffer,SIZE))
{
std::streamsize num = in.gcount();
// call your API with num bytes in buffer
}
对于通过
std::getline(inputstream,一个字符串)读取文本输入,然后分析该字符串可能会很有用。将此作为答案发布,因为这似乎是OP想要的
我必须先找出有多少数据可用,才能知道缓冲区有多大——这不是真的。请参阅(第二部分)。我必须先找出有多少数据可用,才能知道缓冲区有多大—这不是真的。看(第二部分)。哇,有趣的答案。我想这会管用的。谢谢@edam:为什么你需要提前知道缓冲区的大小,你能不能读到你拥有的缓冲区那么多?@Als:我需要分配一个缓冲区,用istream
中的数据填充它,然后用C风格的API将它传递到库中。因此,最终,我需要一个指向数据和数据长度的指针。您可能希望通过我的链接查看前面的问题。归根结底,@Space_c0w0y的答案似乎应该是一个不错的答案,但总的来说还是有更好的选择——几乎不管你喜欢在速度和优雅之间做什么权衡(特别是,sstream这似乎不太正确……使用istream\u迭代器
跳过istream
上的空格,即使您将其与copy()
一起使用。因此,最终使用的向量
缓冲区已删除所有空格!