std :: stringbuf in_avail()函数输出一个奇怪的数字,即使不对缓冲区进行任何读取,它也比缓冲区大小小很多

问题描述 投票:0回答:1

我正在研究将作为原始数据缓冲区的类,我想知道还有多少字节可用于从缓冲区读取(内部该类使用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()函数输出少得多的字节可读取。我想念什么?检查从缓冲区读取的剩余字节数的正确可靠方法是什么?

c++ string stream byte buffer
1个回答
0
投票

in_avail()应该返回许多已知可用的字符,而不会在调用时阻塞。它无法保证实际流中还可以提供多少个额外的字符,无论如何都无法得知。实际上,它通常返回egptr()gptr()之间的差。由于在写入时保持读取缓冲区的最新状态不会造成不必要的低效率,因此在写入和读取之间切换时势必会产生保守的估计。

© www.soinside.com 2019 - 2024. All rights reserved.