
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Ввод-вывод нижнего уровня
При открытии файла на нижнем уровне с ним связывается дескриптор файла, который используется при последующих операциях с файлом. Основные функции ввода-вывода нижнего уровня :
open()/close() – открыть/закрыть файл;
creat() – создать файл;
read()/write() – читать/писать данные
eof() – проверить достижение конца файла;
lseek() – изменить текущую позицию в файле;
tell() – получить значение текущей позиции в файле.
Функции нижнего уровня не требуют включения в программу stdio.h. Но нужно включить, если используется константа EOF (признак конца файла).
Открытие / закрытие файла
int fd; //объявление дескриптора
fd=open(имя_файла, флаги, права_доступа);
Параметр имя_файла является указателем на массив символов, содержащий имя файла. Параметр флаги определяет режим открытия файла, который является выражением, сформированным (с помощью «|» - побитовой операции ИЛИ) из одной или более предопределенных констант, размещенных в заголовочном файле fcntl.h.
O_APPEND – открыть файл для добавления (для записи в конец файла);
O_BINARY – открыть файл в бинарном режиме;
O_CREAT – создать и открыть новый файл;
O_EXCL – если он указан вместе с флагом O_CREAT и файл уже существует, то функция открытия файла завершается с ошибкой. Этот флаг позволяет избежать непреднамеренного уничтожения уже существующего файла;
O_RDONLY – открыть файл только для чтения;
O_RDWR – открыть файл и для чтения, и для записи;
O_TEXT – открыть файл в текстовом режиме;
O_TRUNC – открыть существующий файл и стереть его содержимое (подготовить для записи новой информации).
Параметр права_доступа должен применяться только в режиме открытия файла O_CREAT, т.е. только при создании нового файла.
В операционных системах MS-DOS и Windows для задания параметра права_доступа используются следующие предопределенные константы (директива #include <sys\stat.h>):
S_IWRITE – разрешить запись в файл;
S_IREAD – разрешить чтение из файла;
SIREAD|S_IWRITE – разрешить и чтение, и запись.
Примеры открытия файла.
1)Открыть файл для чтения:
fd=open(“t.txt”, O_RDONLY);
2)Открыть файл для чтения и записи;
fd=open(“t.txt”, O_RDWR);
Для закрытия файла служит функция close(fd); - при успешном завершении возвращает 0, в случае ошибки - -1. При завершении программы все открытые файлы автоматически закрываются.
Чтение и запись данных
Ввод-вывод данных на нижнем уровне осуществляется функциями:
int read(fd, char* buffer, unsigned int count); - читает количество байтов, равное count, из файла, открытого с дескриптором файла fd, в буфер, определенный указателем buffer. При достижении конца файла возвращает 0, в случае ошибки - -1. Если файл открыт в текстовом режиме, то последовательность символов CR и LF преобразуется в символ ‘\n’ (LF), как и при работе с потоком.
int write(fd, char* buffer, unsigned int count); - записывает последовательность count байтов в файл fd из буфера buffer. В случае ошибки возвращает -1. В текстовом режиме все символы ‘\n’ преобразуются в последовательности символов CR, LF.
Обе функции возвращают количество действительно прочитанных или записанных байтов. Чтение и запись производится с текущей позиции в файле.
Пример. Копирование последовательности отдельных символов из клавиатуры (дескриптор 0) на экран (дескриптор 1):
#include <io.h>
int main()
{ char c[2];
while((read(0,c,2))>0)
write(1,c,2);
return 0;
}
Прочитанный символ и код клавиши <Enter>, который служит признаком завершения набора вводимой последовательности символов, записываются в массив c[] из 2 байтов, откуда они затем функцией write() выводятся на экран.
Запустив программу на выполнение, можно вводить одиночные символы с клавиатуры, завершая ввод каждого из них нажатием на клавишу <Enter>. Результат работы программы может выглядеть так:
V
V
W
W
E
E
<Ctrl+C).
Первый символ из пары одинаковых символов – это символ, введенный с клавиатуры (отображается на экране). Второй символ выведен на экран функцией write().