
- •2) Константы
- •13) Массивы-конечная совокупность данных одного типа
- •19) Сегмент данных для хранения констант
- •3.14159265 Позволяет использовать в программе имя p1 вместо константы 3.14159265. Обратите внимание, что
- •Void main()
- •32) Перечислимые типы
- •Void constr_list(dyn_list &l)
- •37) Объединения
- •Режимы открытия и их назначение
37) Объединения
Полями структур могут быть, в частности, поля битов. Хотя правила языка не имеют ограничений на характер
этих полей, кроме требования, чтобы они помещались в объеме машинного слова, в типичных применениях
поля битов служат для хранения целых данных (чаще типа unsigned).
Описание поля битов состоит из описания типа поля, его имени и указанного после двоеточия размера поля в
битах, например: unsigned status: 6;.
Если имя поля опущено, то создается скрытое поле. Если размер поля битов представлен числом 0, то
следующее поле битов начнется с границы машинного слова.
Структура данных объединение подобна структуре, однако в каждый момент времени может использоваться
(является активным) только один из его компонентов. Шаблон объединения может задаваться записью вида:
union
{
<имя типа1> <компонента1>;
<имя типа2> <компонента2>;
. . .
<имя типаN> <компонентаN>;
};
Поля структуры размещаются в оперативной памяти одно за другим в той последовательности, в которой
перечислены в описании. Поля объединений размещаются, начиная с одного места в памяти и,
следовательно, накладываются друг на друга.
Доступ к компонентам объединения осуществляется тем же способом, что и к компонентам структур.
Пример.
#include <iostream.h>
void main ()
{
union Nata
{
int a;
char b;
} kkk;
kkk.a = 123;
cout << kkk.a; }
Текст этой программы можно взять здесь.
В качестве примера объекта типа union рассмотрим объединение geom_fig[1]:
union
{
int radius; // Окружность.
int a[2]; // Прямоугольник.
int b[3]; // Треугольник.
} geom_fig;
В этом примере обрабатывается только активный компонент, то есть компонент, который последним
получает свое значение. Например, после присваивания значения компоненту radius не имеет смысла
обращение к массиву b.
Обратите внимание на то, что на одних компьютерах поля битов размещаются слева направо, на других -
справа налево. Это значит, что при всей полезности работы с ними, если формат данных, с которыми мы имеем
дело, дан нам свыше, то необходимо самым тщательным образом исследовать порядок расположения полей;
программы, зависящие от такого рода вещей, не переносимы.
Объединения применяются для:
минимизации используемого объема памяти, если в каждый момент времени только один объект из
многих является активным;
интерпретации основного представления объекта одного типа, как если бы этому объекту был присвоен
другой тип.
Таким образом, после задания рассмотренной структуры данных в программе будет находиться переменная,
которая на законных основаниях может хранить "в себе" значения нескольких типов.
43.1 Инициализация. Объединение - это еще один структурированный тип данных. Объединение похоже на
структуру и в своем описании отличается от структуры тем, что вместо ключевого слова struct используется
слово union.
union имя_типа {определения_элементов};
Объединение отличается от структуры способом организации во внутренней памяти. Все элементы
объединения в памяти начинаются с одного байта.
Пусть в программе описана структура:
struct S
{ int i; char ch; long int L;
};
Расположение ее элементов в памяти будет следующим:
байт байт | байт | байт байт байт байт
i | ch | L
Элементы структуры занимают последовательные ячейки памяти с размером, соответствующим типу. Общий
размер структуры равен сумме длин полей.
А теперь рассмотрим объединение со следующим описанием:
union S
{ int i; char ch; long int L;
};
Величина с таким типом в памяти будет расположена следующим образом:
байт | байт | байт | байт |
ch |
i |
L |
Поля объединения накладываются друг на друга. Общий объем занимаемой памяти равен размеру самого
большого поля.
Изменение значения любого поля объединения меняет значения других полей.
38) Для осуществления операций с файлами предусмотрено три класса: ifstream, ofstream и fstream. Эти классы являются производными, соответственно, от классов istream, ostream и iostream. Поскольку эти последние классы, в свою очередь, являются производными от класса ios, классы файловых потоков наследуют все функциональные возможности своих родителей (перегруженные операции << и >> для встроенных типов, функции и флаги форматирования, манипуляторы и пр.). Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл fstream.h.
Существует небольшое отличие между использованием предопределенных и файловых потоков. Файловый поток должен быть связан с файлом прежде, чем его можно будет использовать. С другой стороны, предопределенные потоки могут использоваться сразу после запуска программы, даже в конструкторах статических классов, которые выполняются даже раньше вызова функции main(). Можно позиционировать файловый поток в произвольную позицию в файле, в то время как для предопределенных потоков это обычно не имеет смысла.
Для создания файлового потока эти классы предусматривают следующие формы конструктора:
создать поток, не связывая его с файлом:
ifstream(); ofstream(); fstream();
создать поток, открыть файл и связать поток с файлом:
ifstream(const char *name, ios::openmode mode = ios::in) ; ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc); fstream(const char * name, ios::openmode mode = ios::in | ios::out);
Чтобы открыть файл для ввода или вывода, можно использовать вторую форму нужного конструктора
fstream fs("FileName.dat");
или вначале создать поток с помощью первой формы конструктора, а затем открыть файл и связать поток с открытым файлом, вызвав функцию-член open(). Эта функция определена в каждом из классов потокового ввода-вывода и имеет следующие прототипы:
void ifstream::open(const char *name, ios::openmode mode = ios::in); void ofstream::open (const char * name, ios::openmode mode = ios::out | ios::trunc); void fstream::open (const char * name, ios::openmode mode = ios::in | ios::out);
Здесь name - имя файла, mode - режим открытия файла. Параметр mode является перечислением и может принимать значения, указанные в табл. 8.
Таблица 8