Разряды машинного слова
d | d | d | d | d | c | Не используется | b | b | b | a | a |
Если бы последнее поле было задано так: unsigned d:6, то оно размещалось бы не в первом слове, а в разрядах 0 - 5 второго слова.
Нельзя получить адрес переменной битового поля. Переменные битового поля не могут помещаться в массив. Переходя с компьютера на компьютер нельзя быть уверенным в порядке изменения битов (слева на право или справа налево). Любая программа использует битовые поля и зависит от компьютера. Можно смешивать различные структурные переменные в битовых полях.
Пример:
struct emp {
struct addr address;
float pay;
unsigned lay _ off: 1;
unsigned hourly: 1;
unsigned deductions: 3;
};
Определяет запись служащего, использующего только один байт для хранения информации: статуса служащего; полученной зарплаты и размера удержания. Без использования битовых полей данная информация заняла бы три байта. Обращение к любому полю осуществляется так же, как к элементу записи.
Cмеси.
Смесь (объединение) – это разновидность структуры, позволяющей нескольким переменным различных типов занимать один участок памяти (в разное время). В результате появляется возможность работы в одной и той же области памяти с данными различного вида. Для описания смеси используется ключевое слово union, а соответствующий синтаксис аналогичен синтаксису структуры.
Пусть задано объявление
union r { int ir; float fr; char cr; } Z;
Здесь ir имеет размер 2 байта
fr имеет 4 байта
cr имеет 1 байт
Для Z будет выделена память достаточная, чтобы сохранять самый большой из 3-х приведенных типов. Т.о. размер Z будет 4 байта. В один и тот же момент времени в z может иметь значение только одно из (ir, fr, cr).
Пример:
# include <stdio.h>
union r { int ir; float fr; char cr; } Z;
float f;
/* объявлена смесь Z типа r. Размер смеси будет определяться размером самого длинного элемента. В данном случае fr * /
void main (void)
{
/* В версии Borland С++3.1 обнаружена ошибка при использовании вычисления и функции вывода вещественных значений элементов структур. Чтобы обойти ошибку, присваиваем вещественное значение элемента union простой вещественной переменной f (f=Z.fr;), а затем используем f в выражениях и наоборот * /
printf ( " размер Z = % d байта \ n", sizeof (z) );
/* sizeof(Z) вычисляет длину переменной Z. Соответственно printf распечатывает вычисленную длину * /
printf ("ввод Z.ir \ n");
scant (" % d", & Z.ir);
printf ("значение ir = % d \n", Z.ir);
printf ("введите Z.fr \ n");
scanf (" % f", & f);
Z.fr = f;
/* Фактически запись в Z.fr (что фактически реализован ввод (scanf (" % f", &Z.ir); )*/
printf (" значение fr = % f \ n"; f);
printf (" введите Z.cr \ n");
flushall ();
/* Очистка буферов ввода - вывода. Такая очистка здесь необходима, т.к. в буфере ввода остается символ конца строки от предыдущего ввода, который затем введется спецификацией %с вместо реально набираемого символа.*/
scanf (" % C", & Z.cr);
printf (" значение cr = % C; \ n", Z.cr);
}
Пример:
размер Z = 4 байта
ввод Z.ir
7 <─┐
значение ir = 7
ввод : Z.fr
8. 3 4 5 6 7 8 <─┐
введите Z.cr
p
значение сr = p;
Cредства typedef
С позволяет определять имена новых типов данных с помощью ключевого слова typedef. На самом деле здесь не создается новый тип данных, а определяется новое имя существующему типу, облегчает создание машинно-независимых программ:
Формат:
Typedef тип имя;
где тип - любой существующий тип данных, а имя - это новое имя для данного типа.
Новое имя определяется в дополнение к существующему имени типа, а не замещает его.
Пример:
typedef int Integer;
Данное описание делает слово Integer синонимом слова int. Теперь его можно использовать в объявлениях типа так же как int.
Пример:
# include < stdio.h >
typedef float REAL;
main ()
{ REAL a;
printf ("введите a \ n");
scanf ( "% f", & a );
printf ( "a = % f", a);
}
Результат работы;
Введите а
3.4 5 6 7
а = 3.4 5 6 7
Здесь REAL становится синонимом слова float.
Файлы.
Файл – это организованный набор данных, расположенных на внешнем носителе. В файлах размещаются данные, предназначенные для длительного хранения. Каждому файлу присваивается используемое при обращении к нему уникальное имя. В языке С отсутствуют операторы (инструкции) для работ с файлами. Все необходимые действия выполняются через функции, включенные в стандартную библиотеку. Они позволяют работать с различными устройствами, такими как принтер, диски, коммуникационные каналы и др. Эти устройства сильно отличаются друг от друга. Однако файловая система позволяет устройство сильно отличаться друг от друга. Однако файловая система позволяет преобразовывать их в единое логическое устройство называемое потоком.
Существует два типа потоков:
1. Текстовые
2. Двоичные
Прежде чем читать и записывать информацию в файл, он должен быть открыт. Это можно сделать с помощью библиотечной функции fopen. Она берет внешнее представление файла (например:C:MYFILE.TXT) и связывает его с внутренним логическим именем, которое используется далее в программах. Логическое имя – это указатель на требуемый файл. Его необходимо объявлять. Делается это например так:
FILE * lst;
Здесь FILE – стандартное имя типа, записанное в стандартном определении stdio.h.
lst – это указатель на файл. Обращение к функции fopen в программе осуществляется так:
lst = fopen (спецификация файла, вид использования файла);
Спецификация файла: устройство имя расширение,например:
С: MYFILE TXT
1) Вид использования файла может быть r - означает открыть существующий файл для чтения.
2) w - создать новый файл для записи. (Если файл с указанным именем существует, то он будет переписан).
3) а - дополнить файл (открыть существующий файл для записи информации, начиная с конца файла, либо создать файл, если он не существует).
4) rb - открыть двоичный файл для чтения.
5) wb - создать двоичный файл для записи.
6) аb - дополнить двоичный файл.
7) rt - открыть текстовый файл для чтения.
8) wt - создать текстовый файл для записи.
9) аt - дополнить текстовый файл.
10)r+- открыть существующий файл для записи и чтения.
11) w+ - создать новый файл для записи и чтения.
12) а+ - дополнить или создать файл с возможностью записи и чтения.
13) r+b- открыть двоичный файл для записи и чтения.
14) w+b- создать двоичный файл для записи и чтения.
15) а+b - дополнить двоичный файл с возможностью записи и чтения.
Если режим t или b не задан, то он определяется значением глобальной переменной - fmode.
Если значение - fmode = a BINARY, то файлы открываются в двоичном режиме, а если - fmode = a TEXT - в текстовом режиме. Если константы а BINARY и a TEXT определены в файле fcnfl.n. Строки вида r+в можно записывать в виде rв+. Если в результате обращения h функции fopen возникает ошибка, то она возвращает указатель на константу NULL. Для работы с файлом используются библиотечные функции fprintf, fscanf, fgets, fputs. После окончания работы с файлом, он должен быть закрыт. Делается это с помощью библиотечной функции fclose.
Например:
Fclose (lst);
При успешном завершении функция fclose возвращает значение ноль. Любое другое значение говорит о ошибке.
Дата добавления: 2016-04-14; просмотров: 651;