Как я могу узнать, сколько байтов доступно из std :: istream? - PullRequest
9 голосов
/ 12 июля 2011

Если бы я хотел 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, чтобы выяснить, находится ли указатель get istream в конце потока, я делаю это :

bool at_eof( std::istream &is )
{
    return available( is ) == 0;
}

Мой вопрос:

Есть ли лучший способ получить количество доступных байтов из istream? Если не в стандартной библиотеке, то в boost, возможно?

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Для 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) и последующего анализа этой строки может быть полезно.

3 голосов
/ 12 июля 2011

Публикация этого в качестве ответа, так как кажется, что ОП хочет.

Сначала мне нужно выяснить, сколько данных было доступно, чтобы узнать, насколько велик размер буфера - не так. См. мой ответ (вторая часть).

...