
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Закрытие файла
Открытые на диске файлы после окончания работы рекомендуется закрыть явно, функцией
int fclose(fp);
Функция очищает поток, на который ссылается fp. Все ещё не записанные на диск данные из буфера записываются на диск, а непрочитанные данные из буфера теряются. Поток отключается от файла. Динамическая память под буфером освобождается. Функция fclose(fp) возвращает NULL, если поток был успешно закрыт, или EOF, если были какие-то ошибки.
Открыть файл можно открыть повторно (например, для изменения работы с ним) только после того, как файл будет закрыт с помощью fclose(fp).
Функции в языке c для работы с файлами
В библиотеке языка C имеются следующие функции:
fgetc(0, getc() – ввод (чтение) одного символа из файла;
fputc(0, putc() – запись одного символа в файл;
fprintf() – форматированный вывод в файл;
fscanf() – форматированный ввод (чтение) из файла;
fgets() – ввод (чтение) строки из файла;
fputs() – запись строки в файл.
Двоичный (бинарный) режим обмена с файлами
организуется, например, так:
int c;
c=getc(fp);
putc(c,fp);
Переменная целого типа c использована для приема очередного символа из файла или для записи её значения в файл. Такой обмен с файлами называют также посимвольным.
Используя двоичный обмен с файлами, можно сохранять на диске информацию, которую нельзя непосредственно вывести на экран дисплея (целые и вещественные числа во внутреннем представлении).
При работе с файлами структур используются функции:
fread(ptr, size, N, fp) – из файла fp считывается N элементов по size байт каждый в область памяти с адресом ptr. В случае успеха возвращается число считанных байтов. При ошибке или достижении конца файла – EOF.
fwrite(ptr, size, N, fp) – в файл fp записывается N элементов по size байт каждый, расположенные в области памяти, начиная с адреса ptr.
Строковый обмен с файлами
Для работы с текстовыми файлами удобно использовать функции fgets() и fputs(). Прототипы этих функций в файле stdio.h имеют следующий вид:
int fputs(const char* s, FILE* fp);
char* fgets(char* s, int n, FILE* fp);
Функция fputs() записывает ограниченную символом ‘\0’ строку (на которую указывает s) в файл, определенный указателем fp на поток, и возвращает неотрицательное целое. При ошибках функция возвращает EOF. Символ ‘\0’ в файл не переносится, и символ ‘\n’ не записывается в конце строки вместо ‘\0’.
Функция fgets() читает из определенного указателем fp файла не более (n-1) символов и записывает их в строку, на которую указывает s. Функция прекращает чтение, как только прочтет (n-1) символов или встретит символ новой строки ‘\n’, который переносится в строку s. Дополнительно в конец каждой строки записывается признак окончания строки ‘\0’. В случае успешного завершения функция возвращает указатель s. При ошибке или при достижении конца файла, при условии, что из файла не прочитан ни один символ, возвращается значение NULL. В этом случае содержимое массива, который адресуется указателем s, остается без изменений. (В отличие от fgets() функция gets() отбрасывает символ ‘\n’.)
Указанные функции используем для переноса текста из одного файла в другой. Имена файлов передаются в выполняемую программу из командной строки: f1.dat f2.txt.
#include <stdio.h>
main(int argc, char* argv[])
{ char cc[256];
FILE *f1, *f2;
if((f1=fopen(argv[1],”r”))==NULL)
/*Открытие входного файла*/
{ perror(argv[1]);
return 1;
}
if((f2=fopen(argv[2],”w”))==NULL)
/*Открытие выходного файла*/
{ perror(argv[2]);
return 1;
}
while (fgets(cc, 256, f1)!=NULL)
fputs(cc, f2);
fclose(f1);
fclose(f2);
return 0;
}