
- •1. Объявление класса. Примеры. Понятие инкапсуляции, полиформизма, наследования.
- •2. Доступ к членам класса. Управление доступом к членам класса. Указатель this. Примеры.
- •3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.
- •4. Дружественные ф-ции. Примеры.
- •5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.
- •6. Наследование. Примеры.
- •7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
- •8. Перегрузка операторов при помощи функций-членов класса. Примеры.
- •9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
- •10. Ссылки, ссылки на объекты. Примеры.
- •11. Конструктор копирования. Примеры
- •12. Наследование и спецификаторы доступа. Примеры.
- •13. Конструкторы и деструкторы производных классов. Примеры.
- •14. Указатели и ссылки на производные типы. Примеры.
- •Ссылки на производные классы
- •15. Виртуальные ф-ции. Примеры.
- •16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
- •17. Обработка исключений. Примеры.
- •18. Создание собственных операторов вставки и извлечения. Примеры.
- •19. Файловый ввод-вывод. Примеры.
- •20. Формирование ввода-вывода. Примеры.
- •21. Двоичные файлы. Примеры.
- •22. Произвольный доступ. Примеры.
- •23. Ввод-вывод в массивы Примеры.
- •24. Класс string. Примеры.
- •25. Функции-шаблоны. Примеры.
- •Явная перегрузка функций-шаблонов
- •26. Классы-шаблоны. Примеры.
- •27. Пространства имён. Примеры.
- •28. Статические члены класса. Примеры.
- •30. Идентификация типа во время исполнения. Примеры.
- •31. Новые операторы приведения типов. Примеры.
- •32. Контейнерные классы. Примеры.
22. Произвольный доступ. Примеры.
Произвольный доступ к элементам двоичных файлов.
Каждый файл имеет два связанных с ним значения: указатель чтения и указатель записи, по-другому называемые файловым указателем или текущей позицией.
Система ввода-вывода С++ позволяет осуществлять произвольный доступ с использованием функции seekg() и seekp(). Их наиболее употребительной формой является следующая:
istream &seekg(streamoff offset, seek_dir origin);
ostream &seekp(streamoff offset, seek_dir origin);
При последовательном доступе к элементам файлов перемещение файлового указателя происходит автоматически. Но иногда бывает нужно контролировать его состояние. Для этого используются следующие функции:
seekg() – установить текущий указатель чтения;
tellg() – проверить текущий указатель чтения;
seekp() – установить текущий указатель записи;
tellp() – проверить текущий указатель записи.
Организация доступа к элементам двоичных файлов.
Благодаря наличию файлового указателя, в двоичных файлах допустим произвольный доступ к их элементам, который можно реализовать с помощью перегруженных функций-элементов, унаследованных из класса istream:
istream &seekg(streampos) или
istream &seekg(streamoff, ios::seek_dir);
Типы данных streampos и streamoff эквивалентны значениям типа long, но использовать long в явном виде не рекомендуется из-за неоднозначности работы различных компиляторов. Поэтому их определяют как
typedef long streampos;
typedef long streamoff;
Здесь тип streamoff определен в заголовочном файле iostream. Он определяет область значений, которые может принимать величина offset. В настоящее время streamoff определён как long. Система ввода-вывода С++ обрабатывает два указателя, ассоциированные с каждым файлом. Один из них, get pointer, определяет, где именно в файле будет производиться следующая операция ввода. Другой указатель put pointer
указывает, где именно в файле будет производиться следующая операция вывода. Всякий раз, когда осуществляются операции ввода или вывода, соответствующий указатель автоматически перемещается.
Функция seekg() перемещает указатель get pointer на offset байт от заданного origin, принимающего одно из следующих трех значений:
ios::beg - Начало файла
ios::cur - Текущее положение
ios::end - Конец файла
Функция seekp() перемещает указатель put pointer на offset байт от заданного origin, в качестве которого служит одно из указанных выше значений.
Можно определить текущую позицию файлового указателя, используя следующие функции:
streampos tellg();
streampos tellp();
23. Ввод-вывод в массивы Примеры.
В дополнение к вводу-выводу на консоль и в файлы, система ввода-вывода языка С++ позволяет осуществлять ввод-вывод в массивы. Ввод-вывод на основе массивов использует память в качестве устройства ввода-вывода. Ввод-вывод на основе массивов осуществляется с помощью обычных потоков С++. Единственное, что делает ввод-вывод на основе массивов уникальным, заключается в том, что состыкованным с потоком устройством служит память. Для использования ввода-вывода на основе массивов необходимо включить в программу инструкции:
#include <strstream>
using namespace std;
Классы ввода-вывода в массив
Классами для ввода-вывода на основе массивов являются istrstream, ostrstream и strstream. Эти классы используются для создания потоков ввода, вывода и ввода-вывода соответственно. Все эти классы имеют в качестве базового класса strstreambase. В дополнение к strstreambase класс istrstream имеет в качестве базового также istream. Класс ostrstream порождён от класса ostream, и класс strstream порождён от iоstream. Поэтому все классы для вывода на основе массивов имеют доступ к тем же функциям, что и «нормальные»
классы ввода-вывода. Создание потока вывода Для того, чтобы состыковать поток вывода с массивом, используется конструктор ostrstream:
ostrstream ostr(char *buf, int size, int mode=ios::out);
Здесь buf служит указателем на массив, который будет использоваться для хранения символов, записываемых в поток ostr. Размер массива передаётся параметром size. По умолчанию поток открыт для нормального вывода, но, используя различные режимы, объединённые с помощью побитового ИЛИ,
можно задать необходимый режим. После открытия потока вывода в массив, все выводимые в поток данные
будут помещаться в массив. Однако никаких данных не будет записано за пределы массива. Попытка выполнить такую запись приведет к ошибке.
Ввод из массива
Для того, чтобы состыковать поток ввода с массивом, используется следующий конструктор класса
istrstream: istrstream istr(char *buf);
Здесь buf представляет собой указатель на массив, который будет использоваться, как источник символов, всякий раз при выполнении ввода из потока istr. Массив, на который указывает buf, должен завершаться нулевым символом. Нулевой символ никогда не читается из массива. Если необходимо, чтобы часть строки была использована для ввода, то надо применить следующую форму конструктора istrstream:
istrstream istr(char *buf, int size);
Здесь только первые size элементов массива будут использованы для ввода. Эта строка не обязана оканчиваться нулевым символом, поскольку именно size определяет размер строки. Состыкованный с памятью поток ведёт себя точно так же, как потоки, состыкованные с устройствами.
Использование функций-членов класса ios
Доступ к потокам на основе массивов может быть также осуществлён с помощью стандартных функций-членов классов ios, таких как get() и put(). Также можно использовать функцию eof() для того, чтобы определить, когда будет достигнут конец массива.
Потоки ввода-вывода в массивы
Для потока, способного вводить и выводить данные в массив, надо использовать функцию-конструктор класса strstream: strstream iostr(char *buf, int size, int mode);
Здесь buf указывает на строку, используемую для операций ввода-вывода. Величина size передаёт размер массива. Параметр mode служит для определения режима. Для нормальных операций ввода-вывода этому параметру присваивается значение ios::in|ios::out. Для ввода массив должен оканчиваться
нулём.
Произвольный доступ в массив
Все обычные операции ввода-вывода сохраняют своё значение для ввода и вывода в массивы. Сюда относится также произвольный доступ с использованием функций seekg() и seekp().