Spec-Zone.ru › C++

std::basic_istream<CharT,Traits>::readsome

std::streamsize readsome( char_type* s, std::streamsize count );

Извлекает из входного потока до count немедленно доступных символов. Извлечённые символы сохраняются в массиве символов, на который указывает s.

Ведёт себя как UnformattedInputFunction. После создания и проверки объекта sentry:

  • Если rdbuf()->in_avail() == -1, вызывает setstate(eofbit) и не извлекает символы.
  • Если rdbuf()->in_avail() == 0, не извлекает символы.
  • Если rdbuf()->in_avail() > 0, извлекает std::min(rdbuf()->in_avail(), count) символов и сохраняет их в последовательных элементах массива символов, первый элемент которого находится по адресу s.

Параметры

s - указатель на массив символов, в который будут сохранены символы
count - максимальное количество символов для чтения

Возвращаемое значение

Количество фактически извлечённых символов.

Исключения

failure, если произошла ошибка (флаг состояния ошибки не равен goodbit) и для этого состояния установлен exceptions(), вызывающий исключение.

Если внутренняя операция выбрасывает исключение, оно перехватывается, а badbit устанавливается. Если для badbit установлен exceptions(), исключение выбрасывается повторно.

Примечания

Поведение этой функции в значительной степени зависит от реализации. Например, использование readsome() с std::ifstream приводит к существенным результатам, зависящим от реализации. Некоторые реализации библиотеки заполняют базовый filebuf данными сразу после того, как std::ifstream открывает файл, а это означает, что readsome() всегда считывает данные и может даже прочитать весь файл. В других реализациях std::ifstream считывает данные из файла только при вызове операции ввода, поэтому вызов readsome() сразу после открытия файла никогда не извлекает символы. Аналогично, вызов std::cin.readsome() может вернуть все ожидающие обработки данные консольного ввода или всегда возвращать ноль и не извлекать символы.

Пример

#include <cassert>
#include <iostream>
#include <sstream>

int main()
{
    char c[10] = "*********"; // c[9] == '\0'

    // std::stringbuf makes its entire buffer available for unblocking read
    std::istringstream input("This is sample text.");

    auto r = input.readsome(c, 5); // reads 'This ' and stores in c[0] .. c[4]
    assert(r == 5);
    std::cout << c << '\n';

    r = input.readsome(c, 9); // reads 'is sample' and stores in c[0] .. c[8]
    assert(r == 9);
    std::cout << c << '\n';
}

Вывод:

This ****
is sample

См. также

read
извлекает блоки символов
(открытая функция-член)
in_avail
получает количество символов, немедленно доступных в области извлечения
(открытая функция-член std::basic_streambuf<CharT,Traits>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/readsome

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API