如果我想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中?
答案 0 :(得分:4)
对于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, a_string)
进行文本输入读取并在之后分析该字符串可能很有用。
答案 1 :(得分:3)
将此作为答案发布,因为它似乎是OP想要的。
我必须首先了解有多少数据可用来知道缓冲区的大小 - 不是真的。见this answer of mine(第二部分)。