|
Программирование >> Процедурные приложения
Далее с помощью оператора sizeof() вычисляется объем памяти в байтах, занимаемый в файле объектом obj1, и функция seekp() перескакивает через него. В результате поверх объекта obj2 записывается объект newobj2. Вторым аргументом функций seekg() и seekp() может быть один из следующих флагов: ios::beg(смещение на указанную величину от начала файла), ios: : cur(смещение на указанную величину от текущей позиции) и ios:: end (смещение на указанную величину от конца файла). Например, данное выражение переместит маркер чтения на 5 байтов от текущей позиции: io.seekg(5, ios::cur); Следующее выражение переместит маркер на 7 байтов от конца файла: io.seekg(-7, ios::end); Определение состояния потока С каждым потоком связана внутренняя переменная состояния. В случае возникновения ошибки устанавливаются определенные биты этой переменной в зависимости от категории ошибки. Общепринято, что если поток класса ostreamнаходится в ошибочном состоянии, то функции записи не выполняются и не меняют состояние потока. Существует ряд функций, позволяющих определить состояние потока:
Приведем пример: ifstreampfsinfile( sample.dat , ios::in); if (pfsinfile.eof ()) pfsinfile.clear() ; состояние потока pfsinfile сбрасывается if (pfsinfile. fail () ) cerr<< >>> ошибка при создании файла sample.dat<<< ; if (pfsinfile. good ()) cin >> my object; if(!pfsinfile) другой способ обнаружения ошибки cout<< >>> ошибка при создании файла sample.dat<<< ; Глава 12. Дополнительные типы данных Структуры o Синтаксис o Доступ к членам структур o Создание простейшей структуры o Передача структур в качестве аргументов функции o Массивы структур o Указатели на структуры o Передача массива структур в качестве аргумента функции o Структуры в C++ o Вложенные структуры Битовые поля Объединения o Синтаксис o Создание простейшего объединения Ключевое слово typedef Перечисления В этой главе рассматриваются некоторые дополнительные типы данных, используемые в С и C++: структуры, объединения, битовые поля и ряд других. Структуры являются очень важным средством, так как служат основой для построения классов - фундаментального понятия объектно-ориентированного программирования. Разобравшись в принципах создания структур, вы легко поймете, как работают классы в C++. Поэтому начнем мы главу с того, что выясним, как формировать простые структуры и массивы структур, передавать их в функции и получать доступ к элементам структур посредством указателей. Объединения и битовые поля являются близкими к структурам типами данных, и после знакомства со структурами вам будет несложно понять их особенности. Структуры Понятию структуры можно легко найти аналог в повседневной жизни. Обычная записная книжка, содержащая адреса друзей, телефоны, дни рождений и прочую информацию, по сути своей является структурой взаимосвязанных элементов. Список файлов и папок в окне Windows - тоже структура. Точнее сказать, это все примеры использования структур, но что такое структура сама по себе? Можно дать следующее определение: структура - это группа переменных разных типов, объединенных в единое целое. Синтаксис Структура создается с помощью ключевого слова struct, за которым следует необязательный тег, а затем - список членов структуры. Тег становится именем нового типа данных и может использоваться для создания переменных этого типа. Описание структуры в общем виде выглядит следующим образом: struct тег { тип1 имя1; тип 2 имя 2; типЗ имяЗ; тип-n имя-п; }; В примерах программ этой главы мы будем работать с такой структурой: struct stboat { char szmodel[iSTRING15 + iNULL CHAR]; char szserial[iSTRING20 + iNULL CHAR]; int iyear; long lmotor hours; float fsaleprice; }; В данном случае создается структура с именем stboat, содержащая описание моторной лодки. Массив szmodel хранит название модели лодки, а массив szserial - ее регистрационный номер. В переменной iyear записан год изготовления лодки, в переменной lmotor hours- наработанный ресурс мотора в часах, в переменной fsaleprice - цена. Создать переменную на основании описанной структуры можно следующим образом: struct stboat stused boat; В этом выражении объявляется переменная stused boat типа structstboat. Допускается и такое объявление: struct stboat { char szmodel[1STRING15 + iNULL CHAR]; char szserial[iSTRING20 + 1NULL CHAR]; int iyear; long lmotor hours; float fsaleprice; } stused boat; В этом случае переменная создается одновременно с описанием структуры. Если больше не предполагается создавать переменные данного типа, то тег структуры можно не указывать: struct { char szmodel[iSTRINGIS + iNULL CHAR]; char szserial[iSTRING20 + iNULL CHAR]; int iyear; long lmotor hours; float fsaleprice; } stused boat; Созданная структура называется безымянной. Больше нигде в программе нельзя будет создать ее экземпляры, разве только придется полностью повторить ее описание. Но зато во время описания структуры можно объявить сразу несколько переменных: struct { char szmodel[1STRING15 + iNULL CHAR]; char szserial[iSTRING20 + iNULL CHAR]; int iyear; long lmotor hours; float fsaleprice; } stboatl, stboat2, stboat3; Компилятор зарезервирует для членов структуры необходимый объем памяти, точно так же, как при объявлении обычных переменных. Дополнительный синтаксис структур в C++ В C++ при создании экземпляра структуры, описанной ранее, ключевое слово structможно не указывать: /* действительно как в С, так и в C++ */ struct stboat stused boat; действительно только в C++
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |