cin.ignore; cin.clear; cin.fail
Потоковые обьекты, такие как cin и cout , также как и любой другой обьект, имеют определенное состояние. Для них состояние оценивается установкой определенных бит, goodbit (установлен по умолчанию и имеет нулевое значение), badbit, failbit . Если по какой то причине поток «сломался», то установится badbit , и программа аварийно завершится. Если была попытка чтения типа, но невозможно читать его из буфера, то устанавливается состояние failbit .
- std::cin.fail() будет означать: да, установлен failbit , поэтому любая попытка читать дальше, будет безуспешным. std::cin будет ждать очистки всех установленных битов состояния.
- Это делается функцией std::cin.clear , вызов которого приводит к обнулению всех битов состояния, а это и есть goodbit . Только после этого можем попытаться читать что то другое. Если мы решили, что в таком случаи(раз не было там числа) нужно пропустить строку и попытаться читать число в новой строке, то мы даем команду «игнорировать»(читать, но оставлять в буфере) много символов, пока не встретим символ перевода строки.
- std::cin.ignore(32767,’\n’); и есть эта команда(вместо 32767 может быть любая большая цифра такая, что точно больше, чем количество символов до ‘\n’)
Отслеживать
ответ дан 29 фев 2020 в 19:47
AR Hovsepyan AR Hovsepyan
15.9k 3 3 золотых знака 14 14 серебряных знаков 30 30 бронзовых знаков
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Cin ignore c что это
Добрый день. Читаю книгу, имеется такой вот код:
#include using namespace std; int main() < int num = 0; while(true) < cout > num; if(cin.good()) < cin.ignore(10, '\n'); break; >cin.clear(); cout cout
Запрашиваем число и проверяем, чтобы оно было числом, а не символом. Но не все тут понимаю.
Почитал про cin.ignore(). Написано, что он считывает до 10 символов, либо до ‘\n’ и исключает их из потока. Я не понимаю, что означает «исключает из потока». Ведь если выполняется cin.good(), то в моем понимании число исключается из потока и в поток ничего передаваться не должно (ведь значение было исключено). Тем не менее на выходе из программы мы получаем наше число. Помогите, пожалуйста, разобраться.
Последний раз редактировалось Dima-War; 13.07.2013 в 08:49 .
cin.get() и его друзья
определенная в классе istream библиотеки по определению извлекает из входного потока один символ и возвращает его целочисленный код. Популярность ей принес тот факт, что ее удобно использовать в программах с консольным интерфейсом, которые запускаются не из консоли, например, из проводника или из графического интерфейса IDE. После завершения работы программы мы не сможем увидеть ее финальный вывод, поскольку выполнится инструкция return и программа завершится, закрывая «за собой» консольное окно.
Функция get() же стандартного потока ввода cin заставляет систему ожидать ввода пользователем любого символа, который она считывает, и программа завершается.
Проблема в том, что работает cin.get() далеко не всегда. Почему? Рассмотрим ситуацию издалека.
Начнем с того, что же такое поток (stream). Ненаучным языком говоря, поток — последовательность символов. Источником символов может служить в частности клавиатура. Символы идут один за другим:
К ним возможен только последовательный доступ, но не произвольный, иными словами, чтобы извлечь из потока символ d , надо предварительно извлечь из него a , b и c . Извлеченный (прочитанный) символ удаляется из потока.
Надо сказать, что если по каким-то причинам из потока прочитаны не все символы до конца строки (символа ‘\n’ ) включительно, то после операции чтения поток не будет пустым. Два самых распространенных способа дают нам два хороших примера.
Уже рассматривавшаяся выше функция get() читает из потока один символ, так что если мы ввели несколько символов, то она оставит за собой непустой поток. И следующий вызов cin.get() будет обречен на «фиаско»: программа вместо того, чтобы остановиться и ждать пользовательского ввода, прочитает из входного потока очередной символ, оставшийся от предыдущего ввода, и продолжит свое выполнение. Или завершится «без спроса». Напомню, что get() возвращает приведенный к типу int код введенного символа, поэтому мы может использовать его в вышеприведенной инструкции — код просто будет выведен на экран.
Собственно вывод: если в конце программы cin.get() не ждет пользовательского ввода, значит, вы оставили за собой непустой входной поток.
2)
int a;
cin>>a;
Перегруженный оператор сдвига, использующийся для ввода данных из потока, который в свою очередь перегружен для работы с целыми числами (так как вызван с параметром a типа int ), считывает символы, являющиеся десятичными цифрами, до тех пор, пока не встретит нецифровой символ. Это может быть пробел, буква, табуляция, конец строки, и так далее.
Все эти символы остались в потоке. Даже если вы просто ввели число и нажали Enter, символ ‘\n’ остался в потоке.
На него и «нарывается» впоследствии cin.get() .
Следующая шуточная программка позволяет воочию увидеть «обидчика». Скомпилируйте ее, запустите и введите, к примеру,
Она выведет символ, на котором «споткнулся» cin.get() .
using namespace std;
Теперь, когда проблема очевидна, рассмотрим ее возможные решения. В порядке увеличения их сложности.
1)
Функция
определенная в классе istream , извлекает из потока символы и отбрасывает их. Причем она так поступает либо с n символами, либо со всеми символами, пока в потоке не встретится символ, заданный параметром delim .
В нашем случае мы стремимся отбросить максимальное число символов, которое может содержать поток, до первого перевода строки включительно.
2)
streambuf* istream::rdbuf() const;
streamsize streambuf::in_avail();
У потока ввода есть буфер чтения, в котором он хранит символы. Мы обращаемся к нему, вызывая функцию rdbuf() . А любой уважающий себя буфер знает, сколько символов в нем содержится. Поскольку и мы хотим это узнать, мы вызываем функцию in_avail() этого буфера. Это количество символов нам и нужно проигнорировать, что достигается так:
cin.ignore(cin.rdbuf()->in_avail());
Второй параметр функции ignore() имеет значение по умолчанию, что делает его необязательным, и мы его просто опускаем при вызове.
3)
int istream::sync();
Использование функции sync() — путь наименьшего сопротивления. Она просто очищает поток от имеющихся в нем символов.
Почему этот способ самый сложный — поищите в Гугле (если есть желание). А я в это время порекомендую Вам выбрать более понравившийся из первых двух и пойду заниматься более полезными делами
Хотя нет, напоследок еще расскажу о функции
void ios::clear(iostate state = goodbit);
Эта функция восстанавливает поток, если он по какой-либо причине оказался в ошибочном состоянии. Например, из потока пытались прочитать число, а там в это время находились буквы. В этом случае, поток переводится в состояние отказа, и дальнейшие операции с ним неосуществимы. В том числе и cin.get() . Функция же clear() «очищает» состояние потока, делая его вновь веселым и работоспособным.
На закуску пример и ссылки.
Класс basic_istream
Описывает объект, который управляет извлечением элементов и закодированными объектами из буфера потока с элементами типа Char_T , также известным как char_type , признаки символов которого определяются классом Tr , также известным как traits_type .
Синтаксис
template > class basic_istream : virtual public basic_ios
Замечания
Большинство функций-членов, которые перегружены operator>> , форматируют входные функции. Они следуют этому шаблону:
iostate state = goodbit; const sentry ok(*this); if (ok) < try < /*extract elements and convert accumulate flags in state. store a successful conversion*/ >catch (. ) < try < setstate(badbit); >catch (. ) < >if ((exceptions()& badbit) != 0) throw; > > setstate(state); return (*this);
Многие другие функции-члены — это неформатированные входные функции. Они следуют этому шаблону:
iostate state = goodbit; count = 0; // the value returned by gcount const sentry ok(*this, true); if (ok) < try < /* extract elements and deliver count extracted elements in count accumulate flags in state */ >catch (. ) < try < setstate(badbit); >catch (. ) < >if ((exceptions()& badbit) != 0) throw; > > setstate(state);
Обе группы функций вызываются setstate(eofbit) при обнаружении конца файла при извлечении элементов. Дополнительные сведения см. в разделе setstate .
Объект класса basic_istream хранит:
- Виртуальный общедоступный базовый объект класса basic_ios . Дополнительные сведения см. в разделе basic_ios .
- Счетчик извлечения для последней неформатированных входных операций (вызывается count в предыдущем коде).
Пример
Дополнительные сведения о входных потоках см. в примере basic_ifstream класса .
Конструкторы
| Конструктор | Description |
|---|---|
| basic_istream | Создает объект типа basic_istream . |
Функции элементов
| Функция-член | Description |
|---|---|
| gcount | Возвращает число символов, считанных во время последнего неформатированного ввода. |
| get | Считывает один или несколько символов из входного потока. |
| getline | Считывает строку из входного потока. |
| ignore | Пропускает несколько элементов после текущей позиции чтения. |
| peek | Возвращает следующий символ для чтения. |
| putback | Помещает указанный символ в поток. |
| read | Считывает указанное количество символов из потока и сохраняет их в массиве. |
| readsome | Чтение только из буфера. |
| seekg | Перемещает позицию чтения в потоке. |
| sentry | Вложенный класс описывает объект, объявление которого структурирует форматированные и неформатированные входные функции. |
| swap | Меняет местами этот объект basic_istream с указанным параметром объекта basic_istream . |
| sync | Синхронизирует связанное с потоком устройство ввода с буфером потока. |
| tellg | Сообщает текущую позицию чтения в потоке. |
| unget | Помещает самый последний считанный символ обратно в поток. |
Операторы
| Operator | Description |
|---|---|
| operator>> | Вызывает функцию для входного потока или считывает форматированные данные из входного потока. |
| operator= | Назначает basic_istream справа от оператора этому объекту. Это назначение перемещения, включающее ссылку rvalue , которая не оставляет копию позади. |
Требования
Заголовок.
Пространство имен std :
basic_istream::basic_istream
Создает объект типа basic_istream .
explicit basic_istream( basic_streambuf* strbuf, bool _Isstd = false); basic_istream(basic_istream&& right);
Параметры
_Isstd
true Значение , если это стандартный поток; false в противном случае .
right
Объект basic_istream для копирования.
Замечания
Первый конструктор инициализирует базовый класс путем вызова init(strbuf) . Он также хранит нуль в счетчике извлечений. Дополнительные сведения см. в разделе init . Дополнительные сведения об этом количестве извлечения см. в разделе «Примечания» в обзоре basic_istream класса .
Второй конструктор инициализирует базовый класс путем вызова move(right) . Он также сохраняет в счетчике извлечения и сохраняет right.gcount() ноль в счетчике извлечения для right .
Пример
Дополнительные сведения о входных потоках см. в примере basic_ifstream::basic_ifstream .
basic_istream::gcount
Возвращает число символов, считанных во время последнего неформатированного ввода.
streamsize gcount() const;
Возвращаемое значение
Замечания
Используется basic_istream::get для чтения неформатированных символов.
Пример
// basic_istream_gcount.cpp // compile with: /EHsc #include using namespace std; int main( )
Type the letter 'a': a 1
basic_istream::get
Считывает один или несколько символов из входного потока.
int_type get(); basic_istream& get(Char_T& Ch); basic_istream& get(Char_T* str, streamsize count); basic_istream& get(Char_T* str, streamsize count, Char_T delimiter); basic_istream& get(basic_streambuf& strbuf); basic_istream& get(basic_streambuf& strbuf, Char_T delimiter);
Параметры
count
Число символов для чтения из strbuf .
delimiter
Символ, который должен завершить чтение, если он обнаружен раньше count .
str
Строка, в которую должна выполняться запись.
Ch
Символ для получения.
strbuf
Буфер, в который должна выполняться запись.
Возвращаемое значение
Без параметров форма get возвращает элемент, считываемый как целое число или конец файла. Остальные формы возвращают поток ( *this ).
Замечания
Первая неформатированная входная функция извлекает элемент, если это возможно, как будто возвращается rdbuf->sbumpc . В противном случае возвращается значение traits_type:: eof . Если функция извлекает элемент без элемента, вызывается setstate(failbit) . Дополнительные сведения см. в разделе setstate .
Вторая функция извлекает int_type элемент meta таким же образом. Если meta сравнивается равным traits_type::eof , вызывается setstate(failbit) функция. В противном случае он хранится traits_type::to_char_type(meta) в Ch . Функция возвращает *this . Дополнительные сведения см. в разделе to_char_type .
Третья функция возвращается get(str, count, widen(‘\n’)) .
Четвертая функция извлекает элементы count — 1 и сохраняет их в массиве, начиная с str . Она всегда сохраняет char_type после сохранения всех извлеченных элементов. В целях тестирования извлечение останавливается:
- в конце файла;
- После извлечения элемента, который сравнивается с delimiter . В этом случае элемент возвращается к управляемой последовательности.
- После извлечения count — 1 элементов функции.
Если функция не извлекает ни один элемент, она вызывает setstate(failbit) . В любом случае она возвращает *this .
Возвращается пятая функция get(strbuf, widen(‘\n’)) .
Шестая функция извлекает элементы и вставляет их в strbuf . Извлечение останавливается в конце файла или на элементе, который сравнивается с равным delimiter , который не извлекается. Оно также останавливается без извлечения соответствующего элемента, если вставка завершается неудачно или создает исключение (которое перехватывается, но не создается повторно). Если функция не извлекает ни один элемент, она вызывает setstate(failbit) . В любом случае функция возвращается *this .
Пример
// basic_istream_get.cpp // compile with: /EHsc #include using namespace std; int main( )
1111
basic_istream::getline
Получает строку из входного потока.
basic_istream& getline( char_type* str, streamsize count); basic_istream& getline( char_type* str, streamsize count, char_type delimiter);
Параметры
count
Число символов для чтения из strbuf .
delimiter
Символ, который должен завершить чтение, если он обнаружен раньше count .
str
Строка, в которую должна выполняться запись.
Возвращаемое значение
Замечания
Первая из этих неформатированных входных функций возвращается getline(str, count, widen(‘\n’)) .
Вторая функция извлекает элементы count — 1 и сохраняет их в массиве, начиная с str . Она всегда сохраняет символ окончания строки после сохранения всех извлеченных элементов. В целях тестирования извлечение останавливается:
- в конце файла;
- После извлечения элемента, который сравнивается с delimiter . В этом случае элемент не помещается обратно, и он не добавляется к управляемой последовательности.
- После извлечения count — 1 элементов функции.
Если функция извлекает элементы или count — 1 элементы, вызывается setstate(failbit) . В любом случае она возвращает *this . Дополнительные сведения см. в разделе setstate .
Пример
// basic_istream_getline.cpp // compile with: /EHsc #include using namespace std; int main( )
basic_istream::ignore
Пропускает несколько элементов после текущей позиции чтения.
basic_istream& ignore( streamsize count = 1, int_type delimiter = traits_type::eof());
Параметры
count
Количество пропускаемых элементов от текущей позиции чтения.
delimiter
Элемент, который, если обнаружен до подсчета, вызывает ignore возврат и разрешение всех элементов после delimiter чтения.
Возвращаемое значение
Замечания
Неформатированная входная функция извлекает до count элементов и удаляет их. Однако если count равно numeric_limits::max , оно принимается как произвольно большое. Извлечение останавливается рано на конце файла или на элементе Ch , который traits_type::to_int_type(Ch) сравнивается с delimiter (который также извлекается). Функция возвращает *this . Дополнительные сведения см. в разделе to_int_type .
Пример
// basic_istream_ignore.cpp // compile with: /EHsc #include int main( ) < using namespace std; char chararray[10]; cout > chararray; cout
Type 'abcdef': abcdef def
basic\_istream::operator>>
Вызывает функцию для входного потока или считывает форматированные данные из входного потока.
basic_istream& operator>>(basic_istream& (* Pfn)(basic_istream&)); basic_istream& operator>>(ios_base& (* Pfn)(ios_base&)); basic_istream& operator>>(basic_ios& (* Pfn)(basic_ios&)); basic_istream& operator>>(basic_streambuf* strbuf); basic_istream& operator>>(bool& val); basic_istream& operator>>(short& val); basic_istream& operator>>(unsigned short& val); basic_istream& operator>>(int& val); basic_istream& operator>>(unsigned int& val); basic_istream& operator>>(long& val); basic_istream& operator>>(unsigned long& val); basic_istream& operator>>(long long& val); basic_istream& operator>>(unsigned long long& val); basic_istream& operator>>(void *& val); basic_istream& operator>>(float& val); basic_istream& operator>>(double& val); basic_istream& operator>>(long double& val);
Параметры
Pfn
Указатель функции.
strbuf
Объект типа stream_buf .
val
Значение для чтения из потока.
Возвращаемое значение
Замечания
Заголовок также определяет несколько глобальных операторов извлечения. Дополнительные сведения см. в разделе operator>> (\) .
Первая функция-член гарантирует, что выражение вызовов ws(istr) форм istr >> ws , а затем возвращается *this . Дополнительные сведения см. в разделе ws .
Второй и третий функции обеспечивают аналогичное поведение других манипуляторов, таких как hex . Остальные функции — это отформатированные входные функции.
basic_istream& operator>>( basic_streambuf* strbuf);
извлекает элементы, если strbuf не является пустым указателем, и вставляет их в strbuf . Извлечение останавливается в конце файла. Оно также останавливается без извлечения соответствующего элемента, если вставка завершается неудачно, или создает исключение (которое перехватывается, но не создается повторно). Если функция не извлекает ни один элемент, она вызывает setstate(failbit) . В любом случае функция возвращается *this . Дополнительные сведения см. в разделе setstate .
basic_istream& operator>>(bool& val);
извлекает поле и преобразует его в логическое значение путем вызова use_facet< num_get(getloc).get( InIt(rdbuf), Init(0), *this, getloc, val) . InIt Здесь определяется как istreambuf_iterator . Функция возвращает *this .
Дополнительные сведения см. в разделе use_facet , getloc , get , rdbuf и istreambuf_iterator .
Каждая из функций:
basic_istream& operator>>(short& val); basic_istream& operator>>(unsigned short& val); basic_istream& operator>>(int& val); basic_istream& operator>>(unsigned int& val); basic_istream& operator>>(long& val); basic_istream& operator>>(unsigned long& val); basic_istream& operator>>(long long& val); basic_istream& operator>>(unsigned long long& val); basic_istream& operator>>(void *& val);
извлеките поле и преобразуйте его в числовое значение путем вызова use_facet(getloc).get(InIt(rdbuf), Init(0), *this, getloc, val) . InIt Здесь определяется как val istreambuf_iterator и имеет тип long unsigned long или void * по мере необходимости.
Если преобразованное значение не может быть представлено как тип val , вызывается setstate(failbit) функция. В любом случае функция возвращается *this . Дополнительные сведения см. в разделе setstate .
Каждая из функций:
basic_istream& operator>>(float& val); basic_istream& operator>>(double& val); basic_istream& operator>>(long double& val);
извлеките поле и преобразуйте его в числовое значение путем вызова use_facet(getloc).get(InIt(rdbuf), Init(0), *this, getloc, val) . InIt Здесь определяется как istreambuf_iterator val и имеет тип double или long double по мере необходимости.
Если преобразованное значение не может быть представлено как тип val , вызывается setstate(failbit) функция. В любом случае она возвращает *this .
Пример
// istream_basic_istream_op_is.cpp // compile with: /EHsc #include using namespace std; ios_base& hex2( ios_base& ib ) < ib.unsetf( ios_base::dec ); ib.setf( ios_base::hex ); return ib; >basic_istream >& somefunc(basic_istream > &i) < if ( i == cin ) < cerr return i; > int main( ) < int i = 0; cin >> somefunc; cin >> i; cout > hex2; cin >> i; cout
basic_istream::operator=
Назначает basic_istream справа от оператора этому объекту. Это назначение перемещения, включающее ссылку rvalue , которая не оставляет копию позади.
basic_istream& operator=(basic_istream&& right);
Параметры
right
Ссылка rvalue на объект basic_ifstream .
Возвращаемое значение
Замечания
Оператор-член вызывает swap(right) .
basic_istream::peek
Возвращает следующий символ для чтения.
int_type peek();
Возвращаемое значение
Следующий символ для чтения.
Замечания
Неформатированная входная функция извлекает элемент, если это возможно, как будто возвращается rdbuf->sgetc . В противном случае возвращается значение traits_type::eof . Дополнительные сведения см. в разделах sgetc и eof .
Пример
// basic_istream_peek.cpp // compile with: /EHsc #include using namespace std; int main( )
abcde
Type 'abcde': abcde a abcde
basic_istream::putback
Помещает указанный символ в поток.
basic_istream& putback( char_type Ch);
Параметры
Ch
Символ для помещения обратно в поток.
Возвращаемое значение
Замечания
Неформатированные входные функции возвращаются Ch , если это возможно, как при вызове rdbuf->sputbackc . Если rdbuf имеет значение NULL, или если вызов sputbackc возвращается traits_type::eof , функция вызывается setstate(badbit) . В любом случае она возвращает *this .
Дополнительные сведения см. в разделе rdbuf , sputbackc , eof , и setstate .
Пример
// basic_istream_putback.cpp // compile with: /EHsc #include using namespace std; int main( )
basic_istream::read
Считывает указанное количество символов из потока и сохраняет их в массиве.
Этот метод является потенциально опасным, так как зависит от вызывающего объекта при проверке правильности переданных значений.
basic_istream& read( char_type* str, streamsize count);
Параметры
str
Массив, из которого должны считываться символы.
count
Число символов для чтения.
Возвращаемое значение
Поток ( *this ).
Замечания
Неформатированная входная функция извлекает элементы count и сохраняет их в массиве, начиная с str . Извлечение останавливается рано в конце файла, в этом случае вызовы setstate(failbit) функции. В любом случае она возвращает *this . Дополнительные сведения см. в разделе setstate .
Пример
// basic_istream_read.cpp // compile with: /EHsc #include using namespace std; int main() < char c[10]; int count = 5; coutabcdeType 'abcde': abcde abcdebasic_istream::readsome
Считывает указанное число значений символов.
Этот метод является потенциально опасным, так как зависит от вызывающего объекта при проверке правильности переданных значений.
streamsize readsome( char_type* str, streamsize count);Параметры
str
Массив, в котором readsome сохраняет символы, которые считывает.count
Число символов для чтения.Возвращаемое значение
Количество символов, которые фактически считываются, gcount .
Замечания
Эта неформатированная входная функция извлекает до count элементов и сохраняет их в массив str .
Эта функция не ожидает входных данных. Она считывает все доступные данные.
Пример
// basic_istream_readsome.cpp // compile with: /EHsc /W3 #include using namespace std; int main( ) < char c[10]; int count = 5; coutbasic_istream::seekg
Перемещает позицию чтения в потоке.
basic_istream& seekg(pos_type pos); basic_istream& seekg(off_type off, ios_base::seekdir way);Параметры
pos
Абсолютное положение, в которое следует переместить указатель чтения.off
Смещение для перемещения указателя чтения относительно way .Возвращаемое значение
Замечания
Первая функция-член выполняет как абсолютный поиск, вторая функция-член выполняет относительный поиск.
Не используйте вторую функцию-член с текстовыми файлами, так как стандартный C++ не поддерживает относительный поиск в текстовых файлах.
Если fail это false , первый вызов newpos = rdbuf->pubseekpos(pos) функции-член для некоторых временных pos_type объектов newpos . В противном случае fail false второй вызов newpos = rdbuf->pubseekoff( off, way) функции. В любом случае, если (off_type)newpos == (off_type)(-1) (операция размещения завершается ошибкой), вызов функции istr.setstate(failbit) . Обе функции возвращают значение *this .
Если fail есть true , функции-члены ничего не делают.
Дополнительные сведения см. в разделе rdbuf , pubseekpos , pubseekoff , и setstate .
Пример
// basic_istream_seekg.cpp // compile with: /EHsc #include #include int main ( ) < using namespace std; ifstream file; char c, c1; file.open( "basic_istream_seekg.txt" ); file.seekg(2); // seek to position 2 file >> c; coutbasic_istream::sentry
Вложенный класс описывает объект, объявление которого структурирует форматированные и неформатированные входные функции.
class sentry < public: explicit sentry( basic_istream& _Istr, bool _Noskip = false); operator bool() const; >;Замечания
В противном случае _Istr.good true конструктор:
- Вызовы _Istr.tie->flush , если _Istr.tie не является пустым указателем.
- Фактически вызывается ws(_Istr) , если _Istr.flags & skipws ненулевое значение.
Если после какой-либо такой подготовки, _Istr.good false конструктор вызывает _Istr.setstate(failbit) . В любом случае конструктор сохраняет значение, возвращаемое _Istr.good в status . Последующий вызов для operator bool доставки этого сохраненного значения.
Дополнительные сведения см. в разделе good , , ws tie flush , , flags , skipws и setstate .
basic_istream::swap
Меняет местами содержимое двух объектов basic_istream .
void swap(basic_istream& right);
Параметры
right
Ссылка lvalue на объект basic_istream .
Замечания
Вызовы basic_ios::swap(right) функции-члены. Она также обменивает количество извлечения с соответствующим значением для right . Дополнительные сведения см. в разделе basic_ios::swap .
basic_istream::sync
Синхронизирует связанное с потоком устройство ввода с буфером потока.
int sync();
Возвращаемое значение
Если rdbuf имеет значение NULL, функция возвращает значение -1. В противном случае вызывается rdbuf->pubsync . Если этот вызов возвращает -1, функция вызывает setstate(badbit) и возвращает -1. В противном случае функция возвращает нуль. Дополнительные сведения см. в разделах pubsync и setstate .
basic_istream::tellg
Сообщает текущую позицию чтения в потоке.
pos_type tellg();
Возвращаемое значение
Текущая позиция в потоке.
Замечания
Если fail есть false , функция-член возвращается rdbuf->pubseekoff(0, cur, in) . В противном случае возвращается значение pos_type(-1) . Дополнительные сведения см. в разделах rdbuf и pubseekoff .
Пример
// basic_istream_tellg.cpp // compile with: /EHsc #include #include int main() < using namespace std; ifstream file; char c; streamoff i; file.open("basic_istream_tellg.txt"); i = file.tellg(); file >> c; cout > c; cout
basic_istream::unget
Помещает самый последний считанный символ обратно в поток.
basic_istream& unget();
Возвращаемое значение
Замечания
Неформатированная входная функция возвращает предыдущий элемент в потоке, если это возможно, как если бы вызывая rdbuf->sungetc rdbuf , если это пустой указатель, или если вызов sungetc возвращался traits_type::eof , функция вызывает setstate(badbit) . В любом случае она возвращает *this .
Дополнительные сведения см. в статьях sungetc , eof и setstate . Сведения о том, как unget может завершиться сбоем, см. в статье basic_streambuf::sungetc .
Пример
// basic_istream_unget.cpp // compile with: /EHsc #include using namespace std; int main( )
Type 'abc': abc abc