Все лекции программирование
.pdfОбъединения
Объединение – это место в памяти, которое используется для хранения переменных, разных типов. Объединение дает возможность интерпретировать один и тот же набор битов не менее, чем двумя разными способами. Объявление объединения (начинается с ключевого слова 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 *режим);
где имя_файла – это указатель на строку символов, представляющую собой допустимое имя файла, в которое также может входить спецификация пути к этому файлу. Строка, на которую указывает режим, определяет, каким
образом файл будет открыт.