Используя функцию s.exceptions
iostream
сгенерировал исключение, если из состояния good
он перешел в другое состояние (см. раздел 10.6).Любая операция, в результате которой поток не находится в состоянии good
Объект класса iostream
iostream
находится в состоянии good
. Это обстоятельство стало основой для распространенной идиомы, предназначенной для считывания потока значений.X x; // "буфер ввода" для хранения одного значения типа X
while (cin>>x) {
// какие-то действия с объектом x
}
// мы окажемся в этой точке, если оператор >> не сможет прочитать
// очередной объект класса X из потока cin
Б.7.3. Операции ввода
Почти все операции ввода описаны в заголовке
string
; эти операции описаны в заголовке
:Если не указано иное, операция ввода возвращает ссылку на объект класса istream
cin>>x>>y
;.Функции get
getline
помещают после символов, записанных в ячейки p[0]
и т.д., число 0
(если символы были введены); функция getline
удаляет признак конца ввода (t
из потока ввода, если он обнаружен, а функция get
этого не делает. Функция read(p,n)
не записывает число 0
в массив после считанных символов. Очевидно, что операторы форматированного ввода проще в использовании и менее уязвимы для ошибок, чем операции неформатированного ввода.Б.7.4. Операции вывода
Почти все операции вывода описаны в заголовке
string
; такие операции описаны в заголовке
.Если не указано иное, операции вставки в поток ostream
cout << x<;.
Б.7.5. Форматирование
Формат потока ввода-вывода управляется комбинацией типа объекта, состояния потока, информацией о локализации (см. раздел
Вопросы локализации выходят за рамки рассмотрения настоящей книги.
Б.7.6. Стандартные манипуляторы
В стандартной библиотеке предусмотрены манипуляторы, соответствующие разнообразным изменениям формата. Стандартные манипуляторы определены в заголовках
,
,
и
(для манипуляторов, получающих аргументы).Каждая из этих операций возвращает ссылку на свой первый операнд потока s
Рассмотрим пример.
cout << 1234 << ',' << hex << 1234 << ',' << oct << 1234 << endl;
Этот код выводит на экран следующую строку:
1234,4d2,2322
В свою очередь, код
cout << '(' << setw(4) << setfill('#') << 12 << ") (" << 12 << ")\n";
выводит на экран такую строку:
(##12) (12)
Для того чтобы явно установить общий формат вывода чисел с плавающей точкой, используйте следующую инструкцию:
b.setf(ios_base::fmtflags(0),ios_base::floatfield)
См. главу 11.
Б.8. Манипуляции строками
В стандартной библиотеке предусмотрены операции классификации символов в заголовке
, регулярные выражения в заголовке
(C++0x) и поддержка С-строк в заголовке
.Б.8.1. Классификация символов
Символы из основного набора могут быть классифицированы так, как показано ниже.
Кроме того, в стандартной библиотеке описаны две полезные функции для изменения регистра символа.
Расширенные наборы символов, такие как Unicode, также поддерживаются стандартной библиотекой, но эта тема выходит за рамки рассмотрения настоящей книги.
Б.8.2. Строки
Класс string
basic_string
для символьного типа char
; иначе говоря, объект string
— это последовательность переменных типа char
.Б.8.3. Сравнение регулярных выражений
Библиотека регулярных выражений еще не является частью стандартной библиотеки, но вскоре станет ею и будет широко доступной, поэтому мы решили привести ее в этом разделе. Более подробные объяснения изложены в главе 23. Ниже перечислены основные функции из заголовка