
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •1.1 Свойства ООП
- •Понятие класса в С++
- •1.2 Понятие класса С++
- •Создание класса
- •1.3 Создание класса
- •Члены класса
- •1.4 Члены класса
- •Инкапсуляция
- •1.5. Инкапсуляция
- •1.6 Функции-члены класса
- •Реализация понятия «дата» при помощи структуры
- •1.7 Реализация понятия «дата» при помощи структуры
- •Реализация понятия «дата» при помощи класса
- •1.8 Реализация понятия «дата» при помощи класса
- •Определение и вызов функций–членов класса
- •Выводы. Примеры
- •1.9 Выводы
- •1.10 Пример создания класса
- •Конструкторы
- •2.1 Конструкторы
- •2.2 Пример класса без конструктора
- •2.3 Пример класса с конструктором
- •2.4. Конструктор с параметрами по умолчанию
- •2.5. Деструкторы
- •2.6. Пример класса с конструктором и деструктором
- •2.7. Подставляемые или inline функции.
- •2.8. Подставляемые функции-члены.
- •2.9. Указатель this
- •2.10. Использование указателя this
- •Дружественные функции
- •3.1 Дружественные функции
- •3.2 Пример дружественной функции
- •3.3 Дружественные классы
- •3.4. Уточнение имени элемента.
- •3.5. Определение переменных непосредственно перед использованием
- •3.6. Статические элементы класса.
- •2.7. Пример
- •Перегруженные функции
- •4. Перегрузка функций и операций
- •4.1 Полиморфизм
- •4.2 Перегруженные функции
- •4.3 Перегрузка конструктора
- •4.4 Выбор экземпляра функции
- •4.5 Перегрузка стандартных операций
- •4.6 Перегрузка операций сложения и присваивания
- •4.7 Перегрузка операций ++ и --
- •4.8 Дружественные функции-операции
- •4.9 Перегрузка операции индексации []
- •4.10 Аргументы по умолчанию
- •5. Работа с объектами
- •5.1 Ссылки в С++
- •5.2 Передача объектов, как аргументов функции
- •5.3 Массивы объектов
- •5.4 Указатель на объект
- •5.5 Динамическое выделение памяти. Операторы new, delete.
- •5.6 Локальные классы
- •5.7 Вложенные классы
- •5.8 Имена заголовочных файлов в С++
- •5.9 Строковые переменные в С++.
- •6. Наследование
- •6.1 Понятие наследования
- •6.2 Базовые и производные классы
- •6.3 Одиночное и множественное наследование
- •6.4 Управление доступом производных классов
- •6.5 Пример
- •6.6 Конструкторы с параметрами при наследовании
- •6.7 Конструкторы при множественном наследовании
- •7. Виртуальные функции. абстрактные классы
- •7.1 Указатели на производные типы
- •7.2 Виртуальные функции
- •7.3 Пример
- •7.4 Чистые виртуальные функции и абстрактные типы
- •7.5 Виртуальные базовые классы
- •7.6 Шаблоны
- •7.7 Шаблоны функций
- •7.8 Пример
- •7.9 Использование шаблонов с двумя типами параметров
- •7.10 Шаблоны классов
fputs(arr, file);
fputs("\n", file);
}
12.9 Функции позиционирования
void rewind (FILE * fptr);
Функция устанавливает индикатор позиции файла на начало файла.
Чтение и запись файла не обязательно осуществлять последовательно. Для перемещения указателя существует специальная функция:
int fseek (FILE * fptr, long num, int orign);
где long num – количество байт смещения от точки отсчёта для установки текущей позиции указателя, int orign – макрос определения точки отсчета, может принимать следующие значения (можно задавать условное обозначение или число):
SEEK SET 0 – от начала файла
SEEK CUR 1 – от текущей позиции файла
SEEK END 2 |
– от конца файла. |
Если num – положительно перемещение указателя осуществляется от начала к концу файла, если отрицательно – наоборот.
Функция возвращает 0, если позиционирование прошло успешно, 1 – если произошла ошибка. При этом не контролируется выход за границу файла.
Функция уничтожение файла:
int remove.(char *filename);
Возвращает 0 – при успехе, < >0 – ошибка
Функция определения ошибок:
int ferror(FILE *fptr);
При возникновении ошибки функции выдают EOF. Для определения причины ошибки, функция должна быть поставлена после каждой операции с файлами.
Чтение из двоичного файла и запись в него
12.10 Чтение из двоичного файла и запись в него
С файлом можно работать не как с последовательностью символов, а как с последовательностью байтов. В принципе, с нетекстовыми файлами работать по-другому не возможно. Однако так можно читать и писать и в текстовые файлы. Преимущество такого способа доступа к файлу заключается в скорости чтения-записи: за одно обращение можно считать/записать существенный блок информации.
При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка "rb" или "wb".
Функции fread() и fwrite() принимают в качестве параметров:
·адрес области памяти, куда данные записываются или откуда считываются,
·размер одного данного какого-либо типа,
·количество считываемых данных указанного размера,
·файловый указатель.
Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно "заказать" считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.
Пример использования функций fread() и fwrite():
#include <stdio.h>
#include <string.h>
main () {
FILE *file;
char shelf1[50], shelf2[100];
int n, m;
file = fopen("shelf1.txt", "rb");
n=fread(shelf1, sizeof(char), 50, file);
fclose(file);
file = fopen("shelf2.txt", "rb");
m=fread(shelf2, sizeof(char), 50, file);
fclose(file);
shelf1[n] = '\0';
shelf2[m] = '\n';
shelf2[m+1] = '\0';
file = fopen("shop.txt", "wb");
fwrite(strcat(shelf2,shelf1), sizeof(char), n+m, file);
fclose(file); }
Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.