Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в программирование на С.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
930.82 Кб
Скачать

7.2 Объединения

Объединение – произвольный тип данных, подобный структуре, элементы которого разделяют одну и ту же область памяти. На различных этапах выполнение программы одни переменные могут оказаться невостребованными, в то время как другие, наоборот, используются только в этой части программы, поэтому объединения экономят пространство вместо того, чтобы впустую тратить память на не использующиеся в данный момент переменные. Элементы объединения могут принадлежать любому типу. Число байтов, используемая для хранения объединения, должно быть, по крайней мере, достаточным для хранения наибольшего из элементов. Ссылаться в данный момент времени можно только на один элемент и, соответственно, только один тип данных. Объединение объявляется с помощью ключевого слова union. Формат объединения тот же, что и в случае структуры.

#include<stdio.h>

union number{

int x;

float y;

};

void main()

{

union number value;

value.x=100;

printf("Put a value in the integer member\nand printf both members.\nint: %d\nfloat: %f",value.x,value.y);

value.y=100.0;

printf("\n\nPut a value in the floating member\nand printf both members.\nint: %d\nfloat: %f",value.x,value.y);

}

Допускается определение неименованного битого поля; такое поле используется как заполнитель структуры и служит для выравнивания следующего битого поля по границе новой ячейки памяти. Например:

struct example

{

unsigned a : 13;

unsigned : 0;

unsigned b : 4;

};

объявление битовое поле без имени длиной 0 бит для того, чтобы перескочить через оставшиеся биты (столько, сколько их будет) ячейки памяти, в которой хранится а, и выровнять b по границе следующей ячейки.

Пример моделирование высокоэффективной тасовки и раздачи карт с разъясняющий тип объединения:

#include<stdio.h>

struct bitCard{

unsigned face : 4;

unsigned suit : 2;

unsigned color : 1;

};

typedef struct bitCard Card;

void fillDeck(Card *);

void deal(Card *);

void main(){

Card deck[52];

fillDeck(deck);

deal(deck);

}

void fillDeck(Card *wDeck){

int i;

for(i=0;i<52;i++)

{

wDeck[i].face = i%13;

wDeck[i].suit = i/13;

wDeck[i].color= i/26;

}

}

void deal(Card *wDeck){

int k1,k2;

for(k1=0,k2=k1+26;k1<26;k1++,k2++)

{

printf("Card:%3d Suit:%2d Color:%2d ",wDeck[k1].face,wDeck[k1].suit, wDeck[k1].color);

printf("Card:%3d Suit:%2d Color:%2d\n",wDeck[k2].face,wDeck[k2].suit, wDeck[k2].color);

}

}

§8 Файлы и потоки

8.1 Объявления файла

В языке С любой файл рассматривается как последовательный поток байтов. Каждый файл оканчивается или маркером конца файла, или особым байтом, определенным в работающей файлами программе. В начале исполнения программы автоматически открываются три файла и связанные с ними потоки – стандартный ввод (указатель файла stdin), стандартный вывод (указатель файла stdout), и стандартный ошибка(указатель файла stderr).

Если хотим вывести строку на экран результатов, то можно написать следующим образом:

fputs(const char*, stdout); - это тоже, что написать puts(const char*);

Если хотим с клавиатуры ввести строку, то можно написать следующим образом:

fgets(char *, int, stdin); - это тоже, что написать gets(const char*);

fprintf(stdout, const char*,…); - это тоже, что printf(const char*,…);

fscan(stdin, const char*,…); - это тоже, что scan(const char*,…);

Файл – это именованный объект, хранящий данные, на каком либо носителе (дискета, винчестер, CD). В переменных и массивах данные хранятся временно. Файлы предназначены для постоянного хранения больших объемов данных Файлы, в отличии от массивов, могут располагаться не только в оперативной памяти (электронном диске), но и на жестких или на внешних носителях. Файлы не имеют фиксированной длины, т.е. могут увеличиваться или уменьшаться. Перед работой с файлом его необходимо открыть, а после работы закрыть.

Файловая система – это совокупность программных средств для доступа к файлам, т.е. имя файла. В файловой системе MS-DOS имена файлов состоят из двух частей, разделенные точкой: имя файла и расширение. Поле имени файла может содержать не более восьми символов, а поле расширения не более трех символов.

Различаются два вида файлов: текстовые и бинарные. Текстовый файл может быть просмотрен и отредактирован с клавиатуры любым текстовым редактором и имеет простую структуру, которая состоит из последовательности символов. Эта последовательность символов можно разбить на строки, каждая строка заканчивается двумя кодами: 10 (0хD) и 13 (0xA). Бинарный файл – это файл, который не имеет структуру текстового файла. Каждая программа для своего бинарного файла определяет свою структуру. Существуют функции для работы как с текстовыми, так и с бинарными файлами.

Для работы с файлами необходимо включить библиотеку <stdio.h>, где находятся прототипы функций работы с файлами. Для открытия файла используют функцию fopen().

FILE * fopen(char *filename, char * mode);

Возвращаемое значение (FILE *) – это указатель на структуру типа FILE, который называется указатель на файл. Возвращаемое значение нужно хранить: во-первых, для проверки открытия файла, т.е. если возвращаемое значение равно NULL, то произошла ошибка при открытии и следовательно нужно остановить работу программы; во-вторых для работы с файлом в программе.

char *filename задает путь, т.е. местонахождение файла и имя открываемого файла.

char *mode – это тип доступа к файлу, который может принимать следующие значения:

“rt”

Открыть текстовый файл для чтения

“wt”

Открыть текстовый файл для записи, если файл существует, то его содержание теряется

“at”

Открыть текстовый файл для записи в конец файла, если файл существует. Если файл не существует, то он создается

“rt+”

Открыть текстовый файл для записи и чтения. Файл должен существовать.

“wt+”

Открыть текстовый файл для записи и чтения. Если файл существует, то его содержание теряется

“at+”

Открыть текстовый файл для записи в конец файла и для чтения, если файл существует. Если файл не существует, то он создается

“rb”

Открыть бинарного файл для чтения

“wb”

Открыть бинарного файл для записи, если файл существует, то его содержание теряется

“ab”

Открыть бинарного файл для записи в конец файла, если файл существует. Если файл не существует, то он создается

“rb+”

Открыть бинарного файл для записи и чтения. Файл должен существовать.

“wb+”

Открыть бинарного файл для записи и чтения. Если файл существует, то его содержание теряется

“ab+”

Открыть бинарного файл для записи в конец файла, если файл существует. Если файл не существует, то он создается

Т.е. “t” для текстового режима, а “b” для бинарного. Если режим не указан, то автоматически берется текстовый.

После работы с файлом его необходимо обязательно закрыть с помощью функции fclose(FILE *), параметром функции является указатель на файл, который был получен при открытии файла.

Например:

FILE *k;

k=fopen(“aaa.bbb”,”w”);

if(!k)

{

printf(“Открытие файла невозможно!!!!\n”);

return;

}

………..

………..

fclose(k);