Функция std :: stringbuf in_avail () выводит странное число, которое намного меньше размера буфера, даже если в буфере не выполняется чтение - PullRequest
0 голосов
/ 22 декабря 2019

Я работаю над классом, который будет буфером для необработанных данных, и я хочу знать, сколько еще байтов доступно для чтения из буфера (внутренне класс использует 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 ()выводит намного меньше байтов, доступных для чтения. Что мне не хватает? И как правильно и надежно проверить, сколько байтов осталось для чтения из буфера?

...