Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Наша программа будет читать файл построчно. Для каждой строки значение счетчика будет увеличиваться на размер только что прочитанной строки. Этот счетчик содержит смещение, с которого начинается следующая строка:
int main() {
// открыть файл для ввода и вывода, а затем перейти в его конец
// аргументы режима файла приведены в табл. 8.4
fstream inOut("copyOut",
fstream::ate | fstream::in | fstream::out);
if (!inOut) {
cerr << "Unable to open file!" << endl;
return EXIT_FAILURE; // EXIT_FAILURE см. p. 6.3.2
}
// inOut открыт в режиме ate, поэтому исходной позицией файла будет
// его конец
auto end_mark = inOut.tellg(); // запомнить позицию первоначального
// конца файла
inOut.seekg(0, fstream::beg); // перейти к началу файла
size_t cnt = 0; // счетчик количества байтов
string line; // содержит каждую строку ввода
// пока нет ошибки и исходные данные читаются
while (inOut && inOut.tellg() != end_mark
&& getline(inOut, line)) { // и можно получить следующую строку
cnt += line.size() + 1; // добавить 1 для новой строки
auto mark = inOut.tellg(); // запомнить позицию чтения
inOut.seekp(0, fstream::end); // установить маркер записи в конец
inOut << cnt; // записать общую длину
// вывести разделитель, если это не последняя строка
if (mark != end_mark) inOut << " ";
inOut.seekg(mark); // восстановить позицию чтения
}
inOut.seekp(0, fstream::end); // перейти к концу
inOut << "\n"; // вывести символ новой строки в конце файла
return 0;
}
Эта программа открывает поток fstream
в режимах in
, out
и ate
(см. табл. 8.4). Первые два режима означают, что предполагается чтение и запись в тот же файл. Режим ate
означает, что начальной позицией открытого файла будет его конец. Как обычно, необходимо удостовериться, что файл открыт корректно, если это не так, следует выйти из программы (см. раздел 6.3.2).
Поскольку программа пишет в свой исходный файл, нельзя использовать конец файла как признак прекращения чтения. Цикл должен закончиться по достижении конца первоначального ввода. В результате сначала следует запомнить первоначальную позицию конца файла. Так как файл открыт в режиме ate
, поток inOut
уже установлен в конец. Сохраним текущую (т.е. первоначальную) позицию конца файла в переменной end_mark
. Запомнив конечную позицию, маркер чтения следует установить в начало файла, чтобы можно было приступить к чтению данных.
Цикл while
имеет три условия выхода: сначала проверяется допустимость потока; если это так, то проверяется, не достигнут ли конец исходных данных. Для этого текущая позиция чтения, возвращаемая функцией tellg()
, сравнивается с позицией, заранее сохраненной в переменной end_mark
. И наконец, если обе проверки пройдены успешно, происходит вызов функции getline()
, которая читает следующую строку из файла. Если вызов функции getline()
успешен, выполняется тело цикла.
Тело цикла начинается с запоминания текущей позиции в переменной mark
. Она сохраняется для возвращения после записи следующего относительного смещения. Вызов функции seekp()
переводит маркер записи в конец файла. Выводится значение счетчика, а затем функция seekg()
возвращается к позиции, сохраненной в переменной mark
. Восстановив положение маркера, можно снова проверить условие выхода из цикла while
.
Каждая итерация цикла выводит смещение следующей строки. Поэтому последняя итерация цикла заботится о записи смещения последней строки. Однако в конец файла следует еще записать символ новой строки. Как и в других случаях записи, для позиционирования в конец файла перед выводом новой строки происходит вызов функции seekp()
.
Упражнение 17.39. Напишите собственную версию программы, представленной в этом разделе.
Резюме
В этой главе рассматривались дополнительные операции ввода-вывода и четыре библиотечных типа: кортеж, набор битов, регулярные выражения и случайные числа.
Шаблон tuple
(кортеж) позволяет объединять члены несоизмеримых типов в единый объект. Каждый кортеж содержит конкретное количество членов, но библиотека не налагает ограничений на их количество.
Тип bitset
(набор битов) позволяет определять коллекции битов определенного размера. Размер набора битов не ограничен размером любого из целочисленных типов и вполне может превышать их. Кроме поддержки обычных побитовых операторов (см. раздел 4.8), набор битов определяет несколько специальных операторов, которые позволяют манипулировать состоянием отдельных битов в наборе.
Библиотека регулярных выражений предоставляет коллекцию классов и функций: класс regex
представляет регулярные выражения, написанные на одном из нескольких общепринятых языков регулярных выражений. Классы соответствия содержат информацию о конкретном соответствии. Они используются функциями regex_search()
и regex_match()
. Эти функции получают объект класса regex
и последовательность символов, а затем обнаруживают соответствия регулярного выражения regex
в данной последовательности символов. Итераторы типа regex
являются адаптерами итераторов, используемых функцией regex_search()
для перебора исходной последовательности и возвращения каждого соответствия. Есть также функция regex_replace(
), позволяющая заменять соответствующие части заданной исходной последовательности указанной альтернативой.
Библиотека случайных чисел — это коллекция процессоров случайных чисел и классов распределения. Процессор случайных чисел возвращает последовательность равномерно распределенных целочисленных значений. Библиотека определяет несколько процессоров с разной производительностью. Процессор default_random_engine
определен как подходящий для большинства случаев. Библиотека определяет также 20 типов распределений. Эти типы распределений используют процессор как источник случайных чисел определенного типа в заданном диапазоне, которые распределены согласно заданной вероятности распределения.
Термины
Генератор случайных чисел(random-number generator). Комбинация типа процессора случайных чисел и типа распределения.
Исключение regex_error
. Тип исключения, передаваемого при синтаксической ошибке в регулярном выражении.
Итератор cregex_iterator
. Подобен итератору sregex_iterator
, но перебирает массив типа char
.
Итератор sregex_iterator
. Итератор, перебирающий строку с использованием заданного объекта класса regex
для поиска соответствий в заданной строке. При вызове функции regex_search()
конструктор позиционирует итератор на первое соответствие. Приращение итератора вызывает функцию regex_search()
, начиная сразу после текущего соответствия в данной строке. Обращение к значению итератора возвращает объект класса smatch
, описывающий текущее соответствие.
Интервал:
Закладка: