Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

Используя функцию s.exceptions, программист может потребовать, чтобы поток iostream сгенерировал исключение, если из состояния good он перешел в другое состояние (см. раздел 10.6).

Любая операция, в результате которой поток не находится в состоянии good, не имеет никакого эффекта; такая ситуация называется “no op”.

Объект класса iostream можно использовать как условие. В данном случае условие является истинным (успех), если поток iostream находится в состоянии good. Это обстоятельство стало основой для распространенной идиомы, предназначенной для считывания потока значений.

X x; // "буфер ввода" для хранения одного значения типа X

while (cin>>x) {

  // какие-то действия с объектом x

}

// мы окажемся в этой точке, если оператор >> не сможет прочитать

// очередной объект класса X из потока cin

<p id="AutBody_Root673"><strong>Б.7.3. Операции ввода</strong></p>

Почти все операции ввода описаны в заголовке , за исключением операций ввода в объект класса string; эти операции описаны в заголовке :

Если не указано иное, операция ввода возвращает ссылку на объект класса istream, поэтому можно создавать цепочки таких операций, например cin>>x>>y;.

Функции get и getline помещают после символов, записанных в ячейки p[0] и т.д., число 0 (если символы были введены); функция getline удаляет признак конца ввода (t из потока ввода, если он обнаружен, а функция get этого не делает. Функция read(p,n) не записывает число 0 в массив после считанных символов. Очевидно, что операторы форматированного ввода проще в использовании и менее уязвимы для ошибок, чем операции неформатированного ввода.

<p id="AutBody_Root674"><strong>Б.7.4. Операции вывода</strong></p>

Почти все операции вывода описаны в заголовке , за исключением операции записи в объекты класса string; такие операции описаны в заголовке .

Если не указано иное, операции вставки в поток ostream возвращают ссылку на его объекты, поэтому можно создавать цепочки операций вывода, например cout << x<;.

<p id="AutBody_Root675"><strong>Б.7.5. Форматирование</strong></p>

Формат потока ввода-вывода управляется комбинацией типа объекта, состояния потока, информацией о локализации (см. раздел ) и явными операциями. Большая часть информации об этом изложена в главах 10-11. Здесь мы просто перечислим стандартные манипуляторы (операции, модифицирующие поток), поскольку они обеспечивают наиболее простой способ изменения формата.

Вопросы локализации выходят за рамки рассмотрения настоящей книги.

<p id="AutBody_Root676"><strong>Б.7.6. Стандартные манипуляторы</strong></p>

В стандартной библиотеке предусмотрены манипуляторы, соответствующие разнообразным изменениям формата. Стандартные манипуляторы определены в заголовках , , , и (для манипуляторов, получающих аргументы).

Каждая из этих операций возвращает ссылку на свой первый операнд потока 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.

<p id="AutBody_Root677"><strong>Б.8. Манипуляции строками</strong></p>

В стандартной библиотеке предусмотрены операции классификации символов в заголовке , строки с соответствующими операциями в заголовке , регулярные выражения в заголовке (C++0x) и поддержка С-строк в заголовке .

<p id="AutBody_Root678"><strong>Б.8.1. Классификация символов</strong></p>

Символы из основного набора могут быть классифицированы так, как показано ниже.

Кроме того, в стандартной библиотеке описаны две полезные функции для изменения регистра символа.

Расширенные наборы символов, такие как Unicode, также поддерживаются стандартной библиотекой, но эта тема выходит за рамки рассмотрения настоящей книги.

<p id="AutBody_Root679"><strong>Б.8.2. Строки</strong></p>

Класс string из стандартной библиотеки представляет собой специализацию общего шаблонного класса basic_string для символьного типа char; иначе говоря, объект string — это последовательность переменных типа char.

<p id="AutBody_Root680"><strong>Б.8.3. Сравнение регулярных выражений</strong></p>

Библиотека регулярных выражений еще не является частью стандартной библиотеки, но вскоре станет ею и будет широко доступной, поэтому мы решили привести ее в этом разделе. Более подробные объяснения изложены в главе 23. Ниже перечислены основные функции из заголовка .

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT