Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Все лекции программирование

.pdf
Скачиваний:
26
Добавлен:
13.03.2016
Размер:
1.94 Mб
Скачать

Объединения

Объединение – это место в памяти, которое используется для хранения переменных, разных типов. Объединение дает возможность интерпретировать один и тот же набор битов не менее, чем двумя разными способами. Объявление объединения (начинается с ключевого слова union) похоже на объявление структуры и в общем виде выглядит так:

union тег {

тип имя-поля; тип имя-поля; тип имя-поля;

.

.

.

} переменные-этого-объединения;

Например:

union u_type { int i;

char ch; };

union u_type cnvt;

Пример

#include <stdio.h>

union ipAddres { unsigned int ip; unsigned char ch[4]; } ipAddr;

int main() {

int A, B, C, D, i; printf("IP address:\n");

scanf("%d.%d.%d.%d", &A, &B, &C, &D); fflush(stdin);

ipAddr.ip = (A << 24) + (B << 16) + (C << 8) + D; printf("Network Mask is ");

for(i=0;i<4;i++) printf("%d.", ipAddr.ch[i]); return 0;

}

c:\>Example.exe IP address: 10.20.30.40

Network Mask is 40.30.20.10.

Битовые поля

В языке С имеется встроенная поддержка битовых полей, которая дает возможность получать доступ к единичному биту. Цели использования битовых полей:

Если память ограничена, то в одном байте можно хранить несколько булевых переменных (принимающих значения ИСТИНА и ЛОЖЬ);

Некоторые устройства передают информацию о состоянии, закодированную в байте в одном или нескольких битах;

Для некоторых процедур шифрования требуется доступ к отдельным битам внутри байта.

Битовое поле может быть членом структуры или объединения. Оно определяет длину поля в битах. Общий вид определения битового поля такой:

тип имя : длина;

Тип битового поля может быть int, signed или unsigned.

Пример

struct status_type { unsigned delta_cts: 1; unsigned delta_dsr: 1; unsigned tr_edge: 1; unsigned delta_rec: 1; unsigned cts: 1; unsigned dsr: 1; unsigned ring: 1; unsigned rec_line: 1;

} status;

if(status.cts) printf("Разрешение на передачу"); if(status.dsr) printf("Данные готовы");

Перечисления

Перечисление – это набор именованных целых констант. Перечисление в общем виде выглядит так:

enum тег {список перечисления} список переменных;

Здесь тег и список переменных не являются обязательными. Следующий фрагмент кода определяет перечисление с именем coin (монета):

enum coin { penny, nickel, dime, quarter, half_dollar, dollar}; enum coin money;

Главное, что нужно знать для понимания перечислений – каждый их элемент представляет целое число. В таком виде элементы перечислений можно применять везде, где используются целые числа. Каждому элементу дается значение, на единицу большее, чем у его предшественника. Первый элемент перечисления имеет значение 0. Поэтому, при выполнении кода

printf("%d %d", penny, dime); //0 2.

Можно указать значение, используемое как инициализатор. Для этого после перечислителя надо поставить знак равенства, а затем – целое значение. Перечислителям, которые идут после инициализатора, присваиваются значения, большие предшествующего. Например, следующий код присваивает quarter значение 100:

enum coin { penny, nickel, dime, quarter=100, half_dollar, dollar};

Средство typedef

Новые имена типов данных можно определять, используя ключевое слово typedef. Таким способом новый тип данных не создается, а всего лишь определяется новое имя для уже существующего типа. Общий вид декларации typedef (оператора typedef) такой:

typedef тип новое_имя;

где тип — это любой тип данных языка С, а новое_имя – новое имя этого типа. Новое имя является дополнением к уже существующему, а не его заменой.

Например, для float можно создать новое имя с помощью

typedef float balance; balance over_due;

Лекция 10. Файловый ввод / вывод

Потоки и файлы

Текстовый поток – это последовательность символов. В стандарте C считается, что текстовый поток организован в виде строк, каждая из которых заканчивается символом новой строки. Однако в конце последней строки этот символ не является обязательным. В текстовом потоке по требованию базовой среды могут происходить определенные преобразования символов. Например, символ новой строки может быть заменен парой символов — возврата каретки и перевода строки. Поэтому может и не быть однозначного соответствия между символами, которые пишутся (читаются), и теми, которые хранятся во внешнем устройстве. Кроме того, количество тех символов, которые пишутся (читаются), и тех, которые хранятся во внешнем устройстве, может также не совпадать из-за возможных преобразований.

Двоичный поток – это последовательность байтов, которая взаимно однозначно соответствует байтам на внешнем устройстве, причем никакого преобразования символов не происходит. Кроме того, количество тех байтов, которые пишутся (читаются), и тех, которые хранятся на внешнем устройстве, одинаково.

В языке C файлом может быть все что угодно, начиная с дискового файла и заканчивая терминалом или принтером. Поток связывают с определенным файлом, выполняя операцию открытия. Как только файл открыт, можно проводить обмен информацией между ним и программой.

 

Основы файловой системы

 

 

Имя

Назначение

 

 

fopen()

Открывает файл

 

 

fclose()

Закрывает файл

 

 

putc()

Записывает символ в файл

 

 

fputc()

To же, что и putc()

 

 

getc()

Читает символ из файла

 

 

fgetc()

To же, что и getc()

 

 

fgets()

Читает строку из файла

 

 

fputs()

Записывает строку в файл

 

 

fseek()

Устанавливает указатель текущей позиции на определенный байт файла

 

 

ftell()

Возвращает текущее значение указателя текущей позиции в файле

 

 

fprintf()

Для файла то же, что printf() для консоли

 

 

fscanf()

Для файла то же, что scanf() для консоли

 

 

feof()

Возвращает значение true (истина), если достигнут конец файла

 

 

ferror()

Возвращает значение true, если произошла ошибка

 

 

rewind()

Устанавливает указатель текущей позиции в начало файла

 

 

remove()

Стирает файл

 

 

fflush()

Дозапись потока в файл

 

 

Указатель файла

Указатель файла – это указатель на структуру типа FILE. Он указывает на

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

и указатель текущей позиции в начало файла. Чтобы выполнять в файлах операции чтения и записи, программы должны использовать указатели соответствующих файлов. Чтобы объявить переменную-указатель файла, используйте такого рода оператор:

FILE *fp;

Функция fopen() открывает поток и связывает с этим потоком определенный файл. Затем она возвращает указатель этого файла. Чаще всего (а также в оставшейся части этой главы) под файлом подразумевается дисковый файл. Прототип функции fopen() такой:

FILE *fopen(const char *имя_файла, const char *режим);

где имя_файла – это указатель на строку символов, представляющую собой допустимое имя файла, в которое также может входить спецификация пути к этому файлу. Строка, на которую указывает режим, определяет, каким

образом файл будет открыт.