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