- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
9.1. Текстовые и двоичные файлы
Файлы могут быть текстовыми и двоичными. Текстовые файлы могут быть созданы, прочитаны и изменены в любом текстовом редакторе. Для работы с двоичными файлами требуется использовать прикладные программы.
В текстовых файлах данные всех типов хранятся в текстовом формате. Например, число 21 в текстовом файле хранится как два символа: ‘2’ (с кодом 50) и ‘1’ (с кодом 49). Поэтому разные значения данных одного типа в текстовом файле могут занимать разное количество байтов, например, 2 целых числа 1234 и 34567890 занимают в текстовом файле 4 и 8 байтов соответственно. При чтении данных из текстового файла в оперативную память выполняются команды преобразования данных из текстового формата в двоичный формат. При записи данных из оперативной памяти в текстовый файл происходит обратное преобразование. На выполнения этих команд тратится время.
В двоичных файлах данные имеют такой же формат, как формат данных в оперативной памяти. Поэтому для хранения разных значений данных одного типа в двоичном файле требуется одинаковое количество байтов, например, каждое из чисел 1234 и 34567890 занимает в двоичном файле 4 байта. При чтении данных из двоичного файла в оперативную память и при записи данных в файл не требуется преобразование формата данных.
Сравнительнительные характеристики текстовых и двоичных файлов приведены в табл. 5.
Таблица 5
Характеристики текстовых и двоичных файлов
Характеристика файла |
Текстовый файл |
Двоичный файл |
Возможность чтения и записи без программирования |
да |
нет |
Меньший размер |
нет |
да |
Меньшее время чтения и записи |
нет |
да |
Произвольный доступ к данным |
нет |
да |
9.2. Объявление файловых переменных
В С++ файл рассматривается как последовательный поток байтов. При выполнении операций ввода поток байтов файла пересылается от внешнего устройства, например, с дисковода, в оперативную память. При выводе данных из оперативной памяти в файл поток байтов пересылается из оперативной памяти на внешнее устройство. Для работы с файлами в С++ используются классы файловых потоков:
ifstream - входной файловый поток для чтения данных из файла;
ofstream - выходной файловый поток для вывода данных в файл;
fstream двунаправленный файловый поток – для ввода и вывода.
Объявление этих классов находится в заголовочном файле fstream.h, поэтому в программу, работающую с файлами, должен быть включен файл fstream.h. Для работы с файлом надо объявить файловую переменную – переменную типа файловый поток.
Примеры объявления файловых переменных:
ifstream f1;//переменная для чтения файла
ofstream f2;// переменная для вывода в файл
fstream f3; //переменная для чтения и изменения файла
Для связывания файловой переменной с конкретным файлом на компьютере используется функция файловых классов open.
Синтаксис вызова функции open
имя файловой переменной.open(внешнее имя файла
[,режим открытия файла])
Функция имеет два параметра: внешнее имя файла и режим открытия файла. Внешнее имя файла – это полное имя файла. Основные режимы открытия файлов и способы их задания в функции open приведены в табл. 6. Второй параметр необязательный: он устанавливается по умолчанию при объявлении файловой переменной. Значения режима по умолчанию приведены в табл. 7.
Таблица 6
Режимы открытия файла
Режим открытия |
Значение режима открытия |
Чтение текстового файла |
ios::in |
Запись в текстовый файл |
ios::out |
Запись в конец текстового файла |
ios::app |
Изменение (чтение и запись) текстового файла |
ios::in | ios::out |
Удаление содержимого текстового файла |
ios::trunc |
Удаление содержимого текстового файла и запись в файл |
ios::trunс | ios::out |
Чтение двоичного файла |
ios::in | ios::binary |
Запись в двоичный файл |
ios::out | ios::binary |
Запись в конец двоичного файла |
ios::app | ios::binary |
Изменение (чтение и запись) двоичного файла |
ios::in | ios::out | ios::binary |
Удаление содержимого двоичного файла |
ios::trunc | ios::binary |
Удаление содержимого двоичного файла и запись в файл |
ios::trunс | ios::out | ios::binary |
Таблица 7
Значение режима по умолчанию
Тип файловой переменной |
Значение режима открытия файла по умолчанию |
ifstream |
ios::in |
ofstream |
ios::trunc | ios::out |
fstream |
ios::in | ios::out |
Примеры объявления и открытия файлов:
ifstream f1; //переменная для чтения из файла
f1.open(“a.txt”); // по умолчанию режим чтения текстового файла
ofstream f2; //переменная для создания и вывода в файл
f2.open(“b.txt”); //по умолчанию режим записи в текстовый файл
fstream f3; //переменная для чтения и изменения файла
f3.open(“c.txt”);//по умолчанию режим изменения текстового //файла
ifstream f4; //переменная для чтения из файла
f4.open(“d.ddd”,ios::binary|ios::in) ;//режим ввода двоичного файла
ofstream f5; //переменная для записи в файл
f5.open(“d.txt”, ios::app); //режим записи в конец текстового файла
fstream f6; //переменная для чтения и изменения файла
f6.open(“f.dat”, ios::binary|ios::in|ios::out); //режим изменения
//двоичного файла
ofstream f7; //переменная для записи в файл
f7.open(“e.ddd”,ios::binary|ios::out); //режим создания двоичного //файла и записи в него данных, по умолчанию существующий //файл усекается до нулевой длины