Spec-Zone.ru › C++

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

basic_istream& ignore( std::streamsize count = 1, int_type delim = Traits::eof() );
(1)
basic_istream& ignore( std::streamsize count, char_type delim );
(2)
1) Извлекает и отбрасывает символы из входного потока до символа delim включительно.
2) Эквивалентно return ignore(count, traits::to_int_type(delim));. Эта перегрузка участвует в разрешении перегрузки только в том случае, если std::is_same_v<char_type, char> является true.

ignore ведёт себя как функция неформатированного ввода. После создания и проверки объекта sentry функция извлекает символы из потока и отбрасывает их, пока не произойдёт одно из следующих условий:

  • Извлечено count символов. В особом случае, когда count равно std::numeric_limits<std::streamsize>::max(), эта проверка отключена.
  • В последовательности ввода возникает условие конца файла; в этом случае функция вызывает setstate(eofbit).
  • Следующий доступный символ c в последовательности ввода является delim, что определяется с помощью Traits::eq_int_type(Traits::to_int_type(c), delim). Символ-разделитель извлекается и отбрасывается. Эта проверка отключена, если delim является Traits::eof().

Параметры

count - количество символов для извлечения
delim - символ-разделитель, на котором следует остановить извлечение. Он также извлекается

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

*this

Исключения

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

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

Пример

В следующем примере ignore используется для пропуска символов, не являющихся числовыми:

#include <iostream>
#include <limits>
#include <sstream>

constexpr auto max_size = std::numeric_limits<std::streamsize>::max();

int main()
{
    std::istringstream input("1\n"
                             "some non-numeric input\n"
                             "2\n");
    for (;;)
    {
        int n;
        input >> n;
        
        if (input.eof() || input.bad())
            break;
        else if (input.fail())
        {
            input.clear(); // unset failbit
            input.ignore(max_size, '\n'); // skip bad input
        }
        else
            std::cout << n << '\n';
    }
}

Вывод:

1
2

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Опубликованное поведение Правильное поведение
LWG 172 C++98 тип count был ошибочно указан как int исправлен на std::streamsize
P3223R2 C++98 ignore(n, delim) неявно преобразует delim в int_type, что
приводит к неожиданному поведению, если delim является char с отрицательным значением
преобразует delim с помощью traits::to_int_type,
если delim является char

См. также

get
извлекает символы
(открытая функция-член)
getline
извлекает символы до обнаружения заданного символа
(открытая функция-член)

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

Spec-Zone.ru

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