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) |
delim включительно.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 |
См. также
| извлекает символы (открытая функция-член) |
|
| извлекает символы до обнаружения заданного символа (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_istream/ignore