
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •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 Шаблоны классов
выполнения программы функция закрывает все открытые файлы, освобождает все буферы, выводя все необходимые сообщения на экран.
Функции работы с файлами
12.4 Чтение/запись символа в поток
Запись символа в поток
int putc (int ch, FILE * fptr);
Если операция прошла успешно, функция возвращает записанный символ. В случае ошибки возвращается EOF.
Считывание символа из потока
int getс (FILE * fptr);
Функция возвращает EOF, если достигнут конец файла или произошла ошибка. Если считывание произошло успешно – возвращается символ.
Пример
while ((arr[i] = getc (file)) != EOF) {
if (arr[i] == '\n') {
arr[i] = '\0';
printf("%s\n",arr);
i = 0; |
} |
else i++; |
} |
arr[i] = '\0'; |
|
printf("%s\n",arr);
Приведенный в качестве примера код выводит данные из файла на экран.
12.5 Функции работы с файлами
Определение конца файла
int feof (FILE * fptr);
Функция возвращает 0, если достигнут конец файла.
Пример:
while (! feof (fptr)) {ch=getc (fptr) ;}
Закрытие файла
int fclose (FILE * fptr);
Функция возвращает 0, если операция прошла успешно. При этом данные из буфера считываются в файл, происходит освобождение блока управления файлом, ассоциированного с потоком. Файл становится доступен.
Пример:
#include <stdio.h>
main()
{
FILE * in;
int ch;
if ((in = fopen (“test.txt”, “r”)) ! = NULL)
{
while ((ch=getc (in)! = EOF)
putchar (ch);
fclose(in);
}
else
printf ( “Ошибка скрытия файла test.txt\n”);
}
Функции fopen и fclose работают с буферизацией, т. е. вводимые и выводимые данные запоминаются во временной области памяти, называемой буфером. При заполнении буфера его содержимое передаётся в блок и т. д.
Функция fclose освобождает блок.
Форматный ввод/вывод
12.6 Форматный ввод
Формат записи:
int fscanf (FILE * fptr, const char * str, arg);
Функция fscanf() аналогична по смыслу функции scanf(), но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных. Возвращает количество удачно считанных данных
или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.
Допустим, у нас есть файл содержащий такое описание объектов:
apples 10 23.4
bananas 5 25.0
bread 1 10.3
Тогда, чтобы считать эти данные, мы можем написать такую программу:
#include <stdio.h>
main () {
FILE *file;
struct food {
char name[20];
unsigned qty;
float price; };
struct food shop[10];
char i=0;
file = fopen("fscanf.txt", "r");
while (fscanf (file, "%s%u%f", shop[i].name, &(shop[i].qty), &(shop[i].price)) != EOF) {
printf("%s %u %.2f\n", shop[i].name, shop[i].qty, shop[i].price);
i++; }}
В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.
12.7 Форматный вывод
Формат записи: int fprintf (FILE * fptr, const char * str, arg);
Управляющая строка (спецификаторы формата список аргументов) идентичны функциям printf .
Пример 1:
Запись в каждую строку файла полей одной структуры:
file = fopen("fprintf.txt", "w");
while (scanf ("%s%u%f", shop[i].name, &(shop[i].qty), &(shop[i].price)) != EOF) {
fprintf(file, "%s %u %.2f\n", shop[i].name, shop[i].qty, shop[i].price);
i++;
}
Пример 2:
# include <stdio.h>
int main ()
{
FILE * fi;
int age;
fi = fopen (“sam.txt”,”r”);
fscanf (fi, “%d”, & age);
fclose (fi);
fi = fopen (“data.txt”, “a”);
fprintf (fi,”sam is %d\n”, age);
fclose (fi);
}
Можно использовать один и тот же указатель на структуру типа FILE для открытия различных файлов, если это делается последовательно (после закрытия одного файла открывается другой).
Ввод/вывод строк. Функции позиционирования
12.8 Ввод/вывод строк
Ввод/вывод строк осуществляется при помощи функций
fgets (); fputs ();
Функция fgets() аналогична функции gets() и осуществляет построчный ввод из файла. Один вызов fgets() позволят прочитать одну строку. При этом можно прочитать не всю строку, а лишь ее часть от начала.
Параметры fgets() выглядят таким образом:
fgets (char * str, N, FILE * fptr);
где char * str - массив_символов, N- количество_считываемых_символов, FILE * fptr - указ атель_на_файл. Первый элемент функции fgets указывает на строку, функция прекращает работу после считывания символов первой строки или после
достижения MAXLIN – 1.
Если функция gets заменяет символ новой строки на ‘\0’, fgets сохраняет символ новой строки ‘\n’. Функция fgets возвращает NULL при достижении конца файла.
Пример:
fgets (str, 50, myfile);
Такой вызов функции прочитает из файла, связанного с указателем myfile, одну строку текста полностью, если ее длина меньше 50 символов с учетом символа '\n', который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ '\0', добавленный fgets(). Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет '\0'. В таком случае '\n' в считанной строке содержаться не будет.
#include <stdio.h>
#define N 80
main () {
FILE *file;
char arr[N];
file = fopen("fscanf.txt", "r");
while (fgets (arr, N, file) != NULL)
printf("%s", arr);
printf("\n");
fclose(file);}
В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr. Когда считывается следующая строка, предыдущая теряется.
Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.
Построчный вывод в файл осуществляется с помощью функции fputs();
fputs (char * str, FILE * fptr);
В отличие от puts() , fputs() сама не помещает в конце строки '\n'.
Можно напрямую копировать строку в файл.
fputs (“Вы правы”, fi);
Пример.
while (gets (arr) != NULL) {