Программирование >>  Процедурные приложения 

1 ... 67 68 69 [ 70 ] 71 72 73 ... 150


Далее с помощью оператора 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находится в ошибочном состоянии, то функции записи не выполняются и не меняют состояние потока. Существует ряд функций, позволяющих определить состояние потока:

Функция

Действие

eof()

Возвращает ненулевое значение при обнаружении конца файла

fail()

Возвращает ненулевое значение в случае возникновения какой-либо ошибки в потоке, возможно не фатальной; если функция bad() при этом возвращает 0, то, скорее всего, можно продолжать работу с потоком, предварительно сбросив флаг ios:: failbit

bad()

Возвращает ненулевое значение в случае возникновения серьезной ошибки ввода-вывода; в этом случае продолжать работу с потоком не рекомендуется

good()

Возвращает ненулевое значение, если биты состояния не установлены

rdstate()

Возвращает текущее состояние потока в виде одной из констант: ios: :goodbit(нет ошибки), ios:: eofbit(достигнут конец файла), ios::failbit(возможно, некритическая ошибка форматирования или преобразования), ios: :badbit( критическая ошибка)

clear()

Задает состояние потока; принимает аргумент типа int, который по умолчанию равен 0, что соответствует сбросу всех битов состояния, в противном случае содержит одну или несколько перечисленных в предыдущем пункте констант, объединенных с помощью операции побитового ИЛИ ()

Приведем пример:

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++



1 ... 67 68 69 [ 70 ] 71 72 73 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика