Разряды машинного слова

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; просмотров: 645;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.