Лабораторная работа №7 (Работа с файлами)
Цель работы: 1) получить практические навыки программирования задач ввода-вывода с использованием файлов.
Теоретические сведения
Организация ввода и вывода. Файловая система
Операции ввода/вывода в языке Си осуществляются через потоки. Поток - это логическое устройство, выдающее и принимающее информацию.
С потоком связано понятие внутреннего указателя, который определяет позицию, с которой начинается следующая операция чтения или записи. При каждой операции чтения или записи происходит автоматическое перемещение указателя.
В языке Си (С++) формат стандартных файлов ввода/вывода описан в заголовочном файле stdio.h. Имена стандартных файлов ввода/вывода для языка Си (С++) представлены в табл. 7.1. В момент начала выполнения программы на языке Си (С++) автоматически открываются три потока:
stdin, stdout, stderr.
Таблица 7.1
Потоки, определяемые в языке Си и С++
Имя стандартного файла | Описание |
stdaux | Последовательный ввод/вывод |
stderr | Выходной поток ошибок |
stdin | Стандартный ввод |
stdout | Стандартный вывод |
stdprn | Вывод на принтер |
С++ поддерживает всю систему ввода/вывода Си и добавляет к ней дополнительные возможности, связанные в основном с вводом/выводом объектов. Описание средств для создания потоков в С++ представлено в заголовочном файле iostream.h. Когда начинает работать программа на С++, открываются потоки, приведенные в табл. 7.2.
Таблица 7.2
Потоки, определяемые в языке С++
Имя стандартного файла | Описание |
cin | Стандартный ввод - клавиатура |
cout | Стандартный вывод - экран |
cerr | Стандартная ошибка - экран |
clog | Буферизованная версия cerr - экран |
|
Файловая система языков Си и С++ состоит как бы из двух уровней:
· логических файлов;
· физических файлов, с которыми логические файлы всегда связаны.
Логический файл описывается как указатель на открываемый поток FILE * и служит средством взаимодействия с физическим файлом.
Имя физического файла появляется в программе всего один раз, в тот момент, когда происходит открытие файла, осуществляемое функцией fopen() и одновременно его связывание с логическим файлом.
Основными действиями, производимыми над файлами, являются:
· открытие файла,
· обработка файла
· закрытие файла.
Обработка файлов может заключаться в следующем:
· считывание блока данных из потока в оперативную память,
· запись блока данных из оперативной памяти в поток,
· считывание определенной записи данных из потока,
· занесение определенной записи данных в поток.
При этом необходимо помнить, что понятие файла в памяти ЭВМ не определено, и приобретает смысл только после его связи с внешним физическим файлом.
Текстовые файлы
Тип FILE определяется в заголовочном файле stdio.h и обычно представляет собой структуру, содержащую параметры реализации потока, такие как адреса буферов, указатели позиций потока, маркеры ошибок потока и т.д.
При работе с дисковыми файлами в момент их открытия следует задать режим доступа, чтобы определить, к какому файлу осуществляется доступ:
· к текстовому или
· двоичному,
а также способ доступа:
· чтение или
· запись.
Все это выполняется функцией fopen(), имеющей синтаксис:
fopen(" имя_файла ", " режим_доступа ")
|
Режимы доступа к файлам для функции fopen() приведены в табл. 7.3.
Таблица 7.3
Режимы доступа к файлам
Режим | Описание |
r | Открыть файл только для чтения, модификации файла запрещены. |
w | Создать новый файл только для записи. При попытке открыть таким способом существующий файл происходит перезапись файла. Чтение данных из файла запрещено. |
a | Открыть файл для дозаписи. Если файла с указанным именем не существует, он будет создан. |
r+ | Открыть существующий файл для чтения и записи. |
w+ | Создать новый файл для чтения и записи. |
а+ | Открыть существующий файл для дозаписи и чтения. |
Пример: Открыть текстовый файл для чтения
FILE *ft; // объявили указатель на файловый поток
ft = fopen("inp_f.txt","r"); // открыли файл inp_f.txt
При попытке открыть существующий файл можно допустить ошибку в его имени или в указании пути к нужному файлу. Это вызывает ошибку исполнения программы. Следует предвидеть подобные ситуации и проводить проверку возможности открытия файла. Такую проверку осуществить довольно легко, так как функция fopen() возвращает значение указателя в случае успешного его открытия и значение NULL, если доступ к файлу невозможен. Поэтому для проверки достаточно написать:
if (ft = fopen("inp_f.txt","r")!= NULL)
{ // обработка файла
}
Текстовой файл состоит из последовательности символов, разбитой на строки путем использования управляющего символа \n. На диске текстовые файлы хранятся в виде сплошной последовательности символов, и их деление на строки становится заметным лишь в момент вывода на экран или печать, так как именно при выводе управляющие символы начинают выполнять свои функции. Текстовые файлы легко переносятся с одного типа компьютера на другой лишь в случаях, когда они содержат только символы, принадлежащие стандартному набору символов.
|
При работе с текстовыми файлами возможна их посимвольная или построчная обработка.
Основные методы обработки текстовых файлов
Файловые функции ввода/вывода fprintf() и fscanf() работают аналогично функциям printf() и scanf(), но имеют дополнительный аргумент, являющийся указателем на файловый поток.
Пример 7.1. Чтение одного элемента из файла, обработка и запись результата в текстовый файл.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
Void main()
{ FILE *f;
int dig;
if (f = (fopen("inp_f","r")) == NULL) // открыть файл для чтения
{ printf("Невозможно открыть файл!\n");
exit(0);
}
fscanf(f, "%d", &dig); // считать значение dig из файла