- •Лекция 1 Создание консольного приложения
- •2. Консоль. Построение консольного проекта
- •3. Запуск приложения
- •4. Сохранение и редактирование проекта
- •Лекция 2
- •4. Функции форматированного ввода и вывода
- •4.1. Функция форматированного ввода с клавиатуры
- •4.2. Функция форматированного вывода на экран
- •5. Математические функции
- •Лекция 3 Линейные вычислительные процессы
- •1. Алгоритм. Управляющие структуры
- •2. Линейные вычислительные алгоритмы
- •2.1. Условный оператор if()
- •2.2. Условное выражение
- •2.3. Оператор выбора switch()
- •Лекция 5 Программирование разветвляющихся вычислительных процессов
- •Лекция 6 Циклические вычислительные процессы.
- •1. Типы циклов
- •3. Операторы безусловного перехода
- •Лекция 7 Вычисление последовательностей
- •4. Примеры вычисления последовательностей
- •5. Структура алгоритмов вычисления рекуррентных последовательностей
- •Лекция 8 Одномерные массивы
- •1. Массивы
- •1.1. Примеры программ обработки одномерных массивов
- •1.2. Сортировка выбором
- •1.3. Сортировка простыми вставками
- •Лекция 10 Двухмерные массивы
- •1. Двухмерные массивы
- •Лекция 11 Алгоритмы матричной алгебры
- •1. Алгоритмы матричной алгебры
- •Лекция 12 Динамические массивы
- •1. Память компьютера. Адресное пространство
- •2. Динамическая память
- •3. Адреса и указатели
- •4. Указатели и массивы. Динамические массивы
- •5. Проблемы, связанные с указателями
- •6. Поразрядные операции
- •1.2. Способы объявления и обращения к элементам двухмерных массивов
- •Лекция 14 Символы и строки
- •1. Символьный тип данных
- •2. Строки
- •Лекция 15 Структуры
- •1. Понятие структуры
- •2. Определение нового имени типа
- •3. Массивы структур. Указатели на структуры
- •3.1. Определение статического массива структур
- •3.1. Определение динамического массива из n структур
- •Лекция 16 Файлы
- •1. Потоковый ввод-вывод данных
- •3. Понятие файла. Функции работы с файлами
- •Лекция 17 Файлы
- •Лекция 18 Функции пользователя
- •I. Приёмы построения алгоритмов
- •2. Понятие функции
- •2.1. Определение функции
- •2.2. Область видимости переменных
- •2.3. Параметры функции
- •2.4. Описание функции
- •2.5. Организация вызова функции
- •2.5. Передача параметров в функцию
- •3. Рекурсия
- •Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
- •На отрезке [a;b] с заданной точностью eps
- •1.1. Метод дихотомии (половинного деления)
- •1.2. Метод хорд
- •1.3. Метод касательных (Ньютона)
- •Лекция 22 Объектно-ориентированное программирование
- •Полиморфизм – это свойство класса, позволяющее определить одно и то же по имени, но разное по смыслу действие. Основные этапы ооп:
- •Уточнённое имя принадлежит классу (т.Е. Компонентной) функции
- •Лекция 23 Объектно-ориентированное программирование
- •1. Конструкторы и деструкторы
- •1.2. Определение компонентных функций
- •Лекция 25 Объектно-ориентированное программирование
- •1. Свойства классов
- •1.1. Наследование классов
- •1.2. Полиморфизм
- •Библиографический список
3. Понятие файла. Функции работы с файлами
Файлом в С++, с одной стороны, называется последовательность байт, ограниченная стандартной константой EOF – признаком конца файла, с другой стороны, файлом называют некоторое пространство (объём памяти) на жёстком диске или некотором носителе. Таким образом, работа с файлами (запись в файл информации, чтение данных из файла) невозможна без создания потоков.
При работе с файлами создается указатель на поток байтов. Этот поток может быть направлен из ОП на жёсткий диск при записи информации в файл или в ОП с жесткого диска при чтении информации из файла. Кроме того, при чтении или записи информации в файл особое место занимает переменная, которая носит название «указатель файла». Указатель файла определяет позицию (номер байта) в файле, начиная с которой записывается или считывается некоторая порция информации. Следовательно, указатель файла – это адрес байта, который предназначен
для текущей обработки.
В языке С++ работают с потоками (файлами) двух видов: текстовыми и двоичными. Текстовый поток – последовательность символов. В данном разделе такие потоки рассматриваться не будут. Двоичный поток – это последовательность байтов, соответствующая байтам на внешнем устройстве. Далее рассматривается работа именно с такими потоками.
Объявление указателя на поток, который может быть направлен на жесткий диск (файл) записывается в виде:
FILE *<имя_указателя>;
Слово FILE – стандартное имя структурного типа, описанного в головном файле stdio.h. В этой структуре содержится вся необходимая информация для работы с файлами (например, указатель файла и др.).
Следующий этап – это открытие потока с помощью стандартной функции fopen(). Форма открытия потока:
<имя_указателя_на_поток>=fopen(<имя_файла>,<режим_открытия_файла>);
<имя_файла> – строковая величина следующего формата. "<имя>.<расширение>" определяет имя физического файла расположенного на диске. <имя> файла – полный путь к файлу с указанием имени диска и имён папок, в которых находится этот файл. Полный путь записывается в случае, если открываемый файл находится не в одной папке с исполняемой программой. Под строкой <расширение> понимается тип файла.
<режим_открытия_файла> – строковая величина, определяющая режим работы с открытым файлом. Режимы открытия файлов даны в табл.11.
Таблица 11 |
|
Параметр |
Режим |
1 |
2 |
"r" |
Файл открывается только для чтения:
|
"w" |
Файл открывается только для записи:
|
"а" |
Файл открывается для добавления данных:
|
|
|
Продолжение таблицы 11 |
|
1 |
2 |
"r+" |
Файл открывается для чтения и записи. Информация записывается с того места, на которое ссылается указатель файла |
"w+" |
Файл создаётся для чтения и записи. Информация записывается с того места, на которое ссылается указатель файла |
"a+" |
Файл открывается для добавления данных и чтения |
Если файл не может быть открыт по какой-либо причине, то функция fopen() возвращает значение NULL.
Конструкция, позволяющая открыть файл. Если файл невозможно открыть, то работа программы будет корректно завершена:
FILE*pf;
if((pf=fopen("my_file.dat", "r+”)) = = NULL)
{
printf("файл не открыт\n"); return 1;
}
Если поток (файл) открыт удачно, то можно записывать или считывать информацию с жесткого диска (файла) с помощью функций fwrite() или fread(). Формат записи этих функций выглядит следующим образом.
Функция чтения блока данных из файла:
i=fread(<адрес_буфера>,<объем_данных_блока>,<число_читаемых_блоков>, <указатель на поток>);
Здесь i – переменная типа int; i = 1, если было произведено чтение из файла; i = 0, если чтение из файла невозможно; <адрес_буфера> – адрес переменной-буфера в ОП, по которому записываются читаемые данные из файла; <объем_данных_блока> – объем в байтах читаемых в буфер данных из файла; <число_читаемых_блоков> – количество блоков, читаемых из файла. Размер каждого блока указывается в параметре <объем_данных_блока>. <указатель на поток> – указатель на файл.
Функция записи в файл:
i=fwrite(<адрес_буфера>,<объем_данных_блока>,<число_записываемых_блоков>, <указатель на поток>);
Здесь i – переменная типа int; i = 1, если была произведена запись в файл; i = 0, если записи не было; <адрес_буфера> – адрес переменной-буфера в ОП, из которого считываются данные в файл; <объем_данных_блока> – объем в байтах записываемых данных в файл из буфера; <число_читаемых_блоков> – количество блоков, записываемых в файл. Размер каждого блока указывается в предыдущем параметре <объем_данных_блока>. <указатель на поток> – указатель на файл.
При чтении из файла поток направляется с внешнего устройства на ОП. При записи в файл поток направляется из ОП на внешнее устройство. Данные читаются и записывают в ту позицию, на которую указывает указатель файла. Форма записи функции установки указателя файла в заданную позицию:
i = fseek (<указатель_на_поток>, <смещение>, <стартовая_позиция>) ;
Здесь i – переменная типа int; i = 1, если смещение произошло, i = 0, если, например, произошло смещение за пределы файла; <указатель на поток> – указатель на открытый поток; <смещение> (длинное целое) – значение, которое определяет, на сколько байт от стартовой позиции будет смещён указатель файла. Если <смещение> больше нуля, то смещение производится к концу файла, если меньше нуля, то смещение происходит к началу файла. Нужно учитывать то, что автоматически не определяется, был ли указатель перемещен за пределы файла.
<стартовая_позиция> – одна из констант:
SEEK_SET (или 0) – установка указателя файла на нулевой байт файла;
SEEK_CUR (или 1) – определение текущей позиции указателя файла;
SEEK_END (или 2) – установка указателя файла на последний байт файла.
В конце работы необходимо закрыть открытый поток с помощью стандартной функции fclose(). Формат её записи:
fclose(<имя_указателя_на_поток>);
Функции работы с файлами описаны в головном файле stdio.h. Примеры обращения к некоторым из них приведены в табл12.
Таблица 12 |
|
Функция |
Форма обращения к функции |
1 |
2 |
fopen |
pf=fopen("my_file.dat", "r+"); pf – указатель на поток; "my_file.dat" – имя файла; "r+" – файл открывается в режиме чтения/записи |
fgetc |
ch=fgetc(pf); pf – указатель на поток; считывает один символ в переменную ch (тип char) из файла pf. Если достигнут конец файла, то в ch записывается константа EOF |
fputc |
сh1=fputc(ch, pf); pf – указатель на поток; записывает один символ в файл pf из переменной ch (тип char). Если запись произошла, то в ch1 (тип char) возвращается записанный символ, в противном случае в ch1 записывается константа EOF |
getw |
i=getw(pf); pf – указатель на поток; считывает целое число в переменную i (тип int) из файла pf. Если достигнут конец файла, то в i записывается константа EOF |
putw |
i1=putw(i, pf); pf – указатель на поток; записывает целое число в файл pf из переменной i (тип int). Если запись произошла, то в i1 (тип int) возвращается записанное число, в противном случае в i1 записывается константа EOF |
fwrite |
i=fwrite(&buf, sizeof(block),num_block, pf); &buf – адрес буферной переменной; sizeof(block) – объем записываемых данных из переменой buf в файл; num_block – переменная типа int (число записываемых блоков); pf – указатель на файл |
Продолжение таблицы 12 |
|
1 |
2 |
fread |
i=fread(&buf, sizeof(block),num_block, pf); &buf – адрес буферной переменной; sizeof(block) – объем читаемых данных в переменную buf из файла; num_block – переменная типа int (число читаемых блоков); pf – указатель на файл, из которого читается информация |
fseek |
i=fseek(pf, -5, SEEK_END); pf – указатель на поток; -5 – смещение к началу файла; SEEK_END – смещение производится с последнего байта файла |
rewind |
rewind(pf); pf – указатель на поток; возвращает указатель на нулевой байт файла pf |
ftell |
li=ftell(pf); pf – указатель на поток; в переменную li (тип long int) возвращается значение указателя текущей позиции в файле pf |
fclose |
fclose(pf); pf – имя_указателя_на_поток |
remove |
remove ("my_file.dat"); Удаляет файл с именем "my_file.dat" |
Для нахождения длины файла в байтах можно определить конструкцию:
FILE *pf;
long int n;
if((pf=fopen("my_file.dat", "r+”)) = = NULL)
{
printf("файл не открыт\n");
return 1;
}
fseek(pf, 0, SEEK_END); //указатель файла на последнем байте файла
n=ftell(pf); //в переменной n – значение указателя файла, т.е.
//количество байт в файле
rewind(pf); //перемещение указателя файла в начало файла