Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Произвольный доступ для чтения и записи напрямую зависит от системы. Чтобы выяснить способ применения этой возможности, следует обратиться к документации на систему.
Хотя функции seek()
и tell()
определены для всех потоковых классов, возможные для них действия определяются видом объекта, с которым связан поток. В большинстве систем поток, с которым связан потоковый объект cin
, cout
, cerr
или clog
, не обеспечивает возможности произвольного доступа — в конце концов, как можно перейти на десять позиций обратно, если запись осуществляется непосредственно в объект cout
? Применить функции seek()
и tell()
, конечно, можно, но во время выполнения это приведет к ошибке и переходу потока в недопустимое состояние.
Поскольку классы
istream
и ostream
обычно не обеспечивают произвольного доступа, в остальной части этого раздела речь идет только о классах fstream
и sstream
.
Для обеспечения произвольного доступа типы ввода-вывода обладают маркером (marker), который указывает позицию следующей операции чтения или записи. Они обладают также двумя функциями: одна устанавливает (seek) маркер в новую позицию, а вторая сообщает (tell) текущую позицию маркера. Фактически в библиотеке определены две пары функций установки и сообщения, которые описаны в табл. 17.21. Одна пара функций используется потоками ввода, а вторая — потоками вывода. Версии для ввода и вывода различаются суффиксом. Суффикс g
(getting) означает получение данных (чтение), а суффикс p
(putting) — помещение данных (запись).
Таблица 17.21. Функции установки и сообщения
tellg() tellp() |
Возвращает текущую позицию маркера потока ввода ( tellg() ) или потока вывода ( tellp() ) |
seekg(pos) seekp(pos) |
Переустанавливает маркер потока ввода или вывода на заданный параметром pos абсолютный адрес в потоке. Значение pos обычно возвращается предыдущим вызовом в соответствующей функции tellg() или tellp() |
seekp(off, from) seekg(off, from) |
Переустанавливает маркер потока ввода или вывода на off символов вперед или назад от значения from , которое может быть: |
beg — от начала потока; |
|
cur — от текущей позиции потока; |
|
end — от конца потока |
Вполне логично, что для класса istream
, а также производных от него классов ifstream
и istringstream
(см. раздел 8.1) можно использовать только версии g
, а для классов ostream
и классов ofstream
и ostringstream
, производных от него, можно использовать только версии p
. Классы iostream
, fstream
и stringstream
способны читать и записывать данные в поток, поэтому для них можно использовать обе версии, g
и p
.
Тот факт, что библиотека различает версии функций seek()
и tell()
для чтения и записи, может ввести в заблуждение. Хотя библиотека и различает эти функции, в файле существует только один маркер, т.е. нет разных маркеров для чтения и записи.
Когда речь идет о потоке только ввода или вывода, различие не столь очевидно. В таких потоках можно использовать версии только g
или p
. Если попытаться вызвать функцию tellp()
для объекта класса ifstream
, компилятор сообщит об ошибке. Аналогично он поступит при попытке вызвать функцию seekg()
для объекта класса ostringstream
.
Типы fstream
и stringstream
допускают чтение и запись в тот же поток. У них есть один буфер для хранения подлежащих чтению и записи данных, а также один маркер, обозначающий текущую позицию в буфере. Библиотечные функции версий g
и p
используют тот же маркер позиции.
Поскольку существует только один маркер, для переустановки маркера при каждом переключении между чтением и записью следует применять функцию
seek()
.
Имеются две версии функции установки позиции: одна обеспечивает переход к указанной позиции в файле, а другая осуществляет смещение от текущей позиции.
// установка маркера в заданную позицию
seekg(new_position); // установить маркер чтения в позицию pos_type
seekp(new_position); // установить маркер записи в позицию pos_type
// смещение позиции на указанную дистанцию от текущей
seekg(offset, from); // установить дистанцию смещения маркера чтения
seekp(offset, from); // от from; offset имеет тип off_type
Возможные значения параметра from
перечислены в табл. 17.21.
Аргументы new_position
и offset
этих функций имеют машинно-зависимые типы pos_type
и off_type
соответственно. Они определены в классах istream
и ostream
. Тип pos_type
представляет позицию файла, а тип off_type
— смещение от этой позиции. Значение типа off_type
может быть положительным или отрицательным, что соответствует смещению вперед или назад.
Функции tellg()
и tellp()
возвращают значение типа pos_type
, обозначающее текущую позицию в потоке. Эти функции обычно используются для того, чтобы запомнить позицию и впоследствии вернуться к ней:
// запомнить текущую позицию записи в переменную mark
ostringstream writeStr; // поток вывода в строку
ostringstream::pos_type mark = writeStr.tellp();
// ...
if (cancelEntry)
// возврат к отмеченной позиции
writeStr.seekp(mark);
Рассмотрим пример программы, которая читает файл и записывает в его конец новую строку, содержащую относительную позицию начала каждой строки. Предположим, например, что работать придется со следующим файлом.
Abcd
efg
hi
j
Модифицированный программой файл должен выглядеть следующим образом.
Abcd
efg
hi
j
5 9 12 14
Обратите внимание: программа не записывает смещение для первой строки, она всегда начинается с позиции 0
. Обратите также внимание на то, что смещения должны также учитывать невидимый символ новой строки, завершающий каждую строку. И наконец, последнее число в выводе — смещение для строки, с которой начинается вывод. При включении этого смещения в вывод можно отличить свой вывод от первоначального содержимого файла. Можно прочитать последнее число в полученном файле и установить смещение так, чтобы получить позицию начала вывода.
Интервал:
Закладка: