我正在研究将作为原始数据缓冲区的类,我想知道还有多少字节可用于从缓冲区读取(内部该类使用std :: stringbuf,并且从stringbuf进行写入/读取是用std :: iostream完成)。我看到了函数http://www.cplusplus.com/reference/streambuf/streambuf/in_avail/,它说:
获取可读取的字符数
但是当我用80个字节填充缓冲区并调用函数in_avail()而不从缓冲区中读取任何内容时,它说有16个字符可供读取:
#include <iostream>
#include <iomanip>
#include <unistd.h>
using namespace std;
int main()
{
stringbuf sb;
iostream isb{&sb};
uint32_t n = 0xaabbccdd;
for (int i = 0; i < 20; i++)
{
isb.write(reinterpret_cast<char *>(&n), 4);
}
cout << "TEST size = " << sb.str().size() << endl;
uint32_t x;
for (int i = 0; i < 10; i++)
{
cout << isb.rdbuf()->in_avail() << " avail\n";
isb.read(reinterpret_cast<char *>(&x), 4);
sleep(1);
}
}
输出:
TEST size = 80
16 avail
12 avail
8 avail
4 avail
64 avail
60 avail
56 avail
52 avail
48 avail
44 avail
我的直观理解是,在将80个字节写入缓冲区之后,将有80个字符可供读取。例如,在我读取4个字节后,将有76个字符可供读取...然后在读取4个字节后-> 72个可读取的字符...依此类推...但是在一开始,in_avail()函数输出少得多的字节可读取。我想念什么?检查从缓冲区读取的剩余字节数的正确可靠方法是什么?
in_avail()
应该返回许多已知可用的字符,而不会在调用时阻塞。它无法保证实际流中还可以提供多少个额外的字符,无论如何都无法得知。实际上,它通常返回egptr()
和gptr()
之间的差。由于在写入时保持读取缓冲区的最新状态不会造成不必要的低效率,因此在写入和读取之间切换时势必会产生保守的估计。