Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

28.9. Ввод/вывод низкого уровня (префиксный доступ к файлам)

Информация по теме: А.И. Касаткин «Управление ресурсами» – стр. 103-112.

Функции нижнего уровня не требуют включения файла <stdio.h>. Тем не менее, несколько общих констант, определенных в этом файле, могут оказаться полезными (например, признак конца файла EOF). Прототипы функций нижнего уровня содержатся в файле <io.h>.

Функции низкоуровневого ввода-вывода не выполняю никакой буферизации и форматирования. Они непосредственно обращаются к средствам ввода/вывода операционной системы. При открытии файла на этом уровне возвращается дескриптор (file handle), представляющий собой целое число, используемое затем для обращения к этому файлу при дальнейших операциях. Для открытия используется функция open(), для закрытия – функция close(). Функция read() читает данные в указанный буфер, а write() – выводит данные из буфера в файл, lseek() – используется для перемещения по файлу.

Ниже кратко перечислены функции для низкоуровневого доступа к файлам.

Функция

Краткое описание

open()

Открыть файл

close()

Закрыть файл

creat()

Создать файл

eof()

Проверка на конец файла

tell()

Получить текущую позицию указателя файла

lseek()

Позиционирование указателя файла в заданное место

read()

Читать данные из файла

write()

Записать данные в файл

29. Типы, определяемые пользователем: Перечисления, структуры и объединения

Базовые типы данных (int, char, float, …) языка С, а также массивы и указатели, являются фундаментом, на котором строится обработка реальной информации. Но их бывает недостаточно для представления некоторых сложных совокупностей данных. Язык С позволяет программисту определять (или создавать) собственные типы данных.

29.1. Переименование типов – оператор typedef

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

В языке С есть оператор typedef, который позволяет давать типам данных новые имена. Определение типа с typedef имеет следующий вид:

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

Примеры:

typedef long Large; // определяет тип Large, эквивалентный типу long

typedef int Len; // делает имя Len синонимом int

typedef char* String; // делает String синонимом char *,

// т.е. указателем на char

Объявляемый в typedef тип стоит на месте имени переменной в обычном объявлении, а не сразу за словом typedef. Имена новых типов обычно пишут с заглавных букв для того, чтобы они выделялись в тексте программы.

После такого переименования типов типы Large, Len и String можно применять в объявлениях, в операции приведения типа и т.д. точно так же, как типы long, int и char *:

Large x, *plong;

Len *plen, maxlen;

String p = “ggg”, ptr[10];

Обратить внимание! Объявление typedef не создает объявления нового типа, оно лишь дает новое имя уже существующему типу. Никакого нового смысла эти новые имена не несут. Они объявляют переменные в точности с теми же свойствами, как если бы те были объявлены напрямую без переименования типа.