Синтаксис языка Borland C++ позволяет одновременное задание шаблона, определение переменных по данному шаблону и их инициализацию.
Например:
union EXAMPLE
{ int i;
char ch[2];
}; uni = {9650}
13.3. Указатель на объединение
Описание шаблона объединения вводит по существу новый тип данных. Значит, вполне допустимо использовать указатель на введенный тип. Как и любой другой указатель иных типов данных, указатель на объединение занимает либо два байта (near), либо четыре байта (far).
Описание указателя на объединение не отличается от описания указателей на другие типы:
<типы> *<имя_указателя >;
где <тип> - задает имя шаблона объединения, указатель будет данного типа; < имя_указателя > - имя определяемого указателя. Например:
union EXAMPLE
{ int i;
char ch[2];
}; *pexam;
union EXAMPLE *puni1, *puni2;
Указатели на объединение обычно используются для доступа к объединениям, размещенным в динамически выделенной памяти.
13.4. Размещение объединений в памяти
Все элементы объединения размещаются в одной и той же области памяти одного и того же адреса. Память, которая выделяется под объединение, определяется размером наиболее длинного из элементов данного объединения. Например, если описать объединение вида
union EXAMPLE_1
{ int i;
float f;
double d;
char ch;
}uni;
то компилятор выделит под объединение uni 8 байтов, так как данное объединение содержит поле с максимальной длиной 8 байтов (поле типа double).
Если же объявить следующее объединение:
union EXAMPLE_2
{ long double ld;
char let[20];
}uni;
то компилятор выделит под объединение uni 20 байтов, так как в этом случае максимальную длину имеет поле, являющееся символьным массивом из элементов, для размещения которго необходимо 20 байтов, в то время как поле типа long double требует всего 10 байтов.
13.5 Динамическое использование памяти. Библиотечные функции
Одним из способов хранения информации является использование системы динамического выделения памяти языка Borland C++. Область свободной памяти, доступной для выделения, находится между областью памяти, где размещается программа. Эта область называется кучей или хипом (от англ. heap – куча).
Ядром динамического выделения памяти в Borland C++ являются функции№ объявленные в стандартной библиотеке в заголовочном файле stdlib. h, - malloc(), calloc(), realloc(), free().
В языке Borland C++ есть операция, с помощью которой можно определить размер участка памяти в байтах, который компилятор отводит под массив после его объявления, это операция sizeof. Формат записи:
sizeof(параметр);
параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof позволяет определить размер объекта по имени или типу, результатом является размер памяти в байтах (тип результата int).
Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например:
sizeof(int) -> 2 байта,
int b[5]; sizeof(b) -> 10 байт;
int c[3][4]; sizeof(c) -> 24 байта.
Операция sizeof применяется при динамическом распределении памяти:
float *x; // Указатель массива
int n; // Количество элементов массива
x=(float*)calloc(n, sizeof(float)); // Захват и очистка памяти
Прототипы функций работы с памятью находятся в библиотеке alloc. h, рассмотрим основные из них:
void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;
void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;
void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;
void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;
coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).
Приведем пример динамического размещения одномерного массива
#include<stdio. h>
#include<stdlib. h>
#include<conio. h>
#include<alloc. h>
void main(void)
{ int i, n; float *a;
puts(“\n Input n:”); scanf(“%d”,&n);
printf(“\n Свободная память -%d”,coreleft());
a=(float *)calloc(n, sizeof(float));// захват памяти
printf(“\n Array a \n”);
for(i=0; i<n; i++)
{
*(a+i)=(float)random(10); // диапазон от 0 до 10
printf(“ %d“, a[i]);
}
printf(“\n Память после захвата -%d”,coreleft());
free(a); // освобождение памяти
getch();
}
Практическое занятие № 14
Тема. Файлы
Цель: Изучить способы создания и работы с файлами в языке Borland C++.
Краткие теоретические сведения по теме
14.1. Понятие файла и файловой системы
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое.
Прежде, чем работать с файлом его нужно открыть для доступа, т. е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т. д.
В алгоритмическом языке Borland C++ это делает функция fopen. Она связывает физический файл на носителе, например B:\LR7.CPP, с логическим именем в программе. Логическое имя – это указатель на файл, т. е. на область памяти, где храниться информация о файле. Указатели на файлы необходимо объявлять. Формат объявления такого указателя следующий:
FILE *указатель на файл;
Например.
FILE *f;
f=fopen ("B:\LR7.СPP", "w");
Символ "w" определяет право доступа к открываемому файлу. В данном случае открывается файл LR7.СPP на диске B:\ только для чтения.
В Borland C++ используются следующие коды, устанавливающие режимы доступа к открываемым файлам:
Символ | Описание |
R | Файл открывается только для чтения. Если нужного файла на диске нет, то возникает ошибка. |
W | Файл открывается только для записи. Если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается. |
A | Файл открывается для дозаписи в его конец новой информации. |
r+ | Файл открывается для редактирования его данных. Возможны и запись, и чтение информации. |
w+ | То же, что и для r+. |
a+ | То же, что и для a, только запись можно выполнять в любое место файла. Доступно и чтение файла. |
T | Файл открывается в текстовом режиме. Указывается поле r, w, a, r+, w+, a+. |
B | Файл открывается в двоичном режиме. Указывается поле r, w, a, r+, w+, a+. |
Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов « перевод-строки», «возврат каретки» заменяется на один символ: « перевод-строки» для всех функций записи данных в файл, а для всех функций вывода символ «перевод-строки» теперь заменяется на два символа: « перевод-строки»,«возврат каретки».
По умолчанию файл открывается в текстовом режиме.
После работы с файлом, доступ к файлу необходимо закрыть. Закрывает файл в языке Borland C++ функция fclose. Например, из предыдущего примера ее закрывается так: fclose (f);
Для открытия нескольких файлов введена функция, объявленная следующим образом: Void fcloseall(Void);
Если требуется изменить режим доступа к файлу, то для этого сначала необходимо закрыть данный файл, а затем вновь его открыть, но с другими правами доступа. Для этого используют стандартную функцию freopen, описанную в stdio. h как FILE* freopen (char filename, chov*mode, FILE *stream). Эта функция сначала закрывает файл, связанный с потоком stream (как это делает функция fopen), а затем открывает файл с именем filename и правами доступа mode, записывая информацию об этом файле в переменную stream.
В алгоритмическом языке Borland C++ имеется возможность работы с временными файлами, т. е. с такими, которые нужны только в процессе работы программы и которые надо удалить после выполнения части вычислений. в этом случае используют функцию tmpfile со следующим объявлением: FILE* tmpfile (void).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |


