Читать книги » Книги » Компьютеры и Интернет » Программирование » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Читать книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп, Бьёрн Страуструп . Жанр: Программирование.
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Название: Программирование. Принципы и практика использования C++ Исправленное издание
Дата добавления: 26 август 2023
Количество просмотров: 472
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

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

Программирование. Принципы и практика использования C++ Исправленное издание - читать онлайн , автор Бьёрн Страуструп

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка.
Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие.
Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток.
Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

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

В каждом из этих режимов открытие файла может зависеть от операционной системы и ее возможностей учесть требование программиста открыть файл именно так, а не иначе. В результате поток может не оказаться в состоянии good(). Рассмотрим пример.

void my_code(ostream& os); // функция my_code может использовать

                           // любой поток вывода

ostringstream os;          // буква "o" означает "для вывода"

ofstream of("my_file");

if (!of) error("невозможно открыть 'my_file' для записи");

my_code(os); // используется объект класса string

my_code(of); // используется файл

См. раздел 11.3.

Б.7.2. Обработка ошибок

Поток iostream может пребывать в одном из четырех состояний.

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

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

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

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

while (cin>>x) {

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

}

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

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

Б.7.3. Операции ввода

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

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

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

Б.7.4. Операции вывода

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

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

Б.7.5. Форматирование

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

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

Б.7.6. Стандартные манипуляторы

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

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

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

Б.8.1. Классификация символов

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

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

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

Б.8.2. Строки

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

Б.8.3. Сравнение регулярных выражений

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

Поиск (searching) строки, соответствующей регулярному выражению в (произвольно длинном) потоке данных, — обеспечивается функцией regex_search().

Сопоставление (matching) регулярного выражения со строкой (известного размера) — обеспечивается функцией regex_match().

Замена соответствий (replacement of matches) — обеспечивается функцией regex_replace(); в данной книге не описывается; см. профессиональные учебники или справочники.

Результатом работы функций regex_search() и regex_match() является коллекция соответствий, как правило, представленных в виде объекта класса smatch.

regex row("^[\w ]+(\d+)(\d+)(\d+)$"); // строка данных

while (getline(in,line)) { // проверка строки данных

  smatch matches;

  if (!regex_match(line, matches, row))

  error("bad line", lineno);

  // проверка строки:

  int field1 = from_string<int>(matches[1]);

  int field2 = from_string<int>(matches[2]);

  int field3 = from_string<int>(matches[3]);

  // ...

}

Перейти на страницу:
Комментарии (0)