Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
17.04.2013
Размер:
76.29 Кб
Скачать

Лабораторная работа.

Файлы в языке С++.

Цель работы: получить практические навыки решения задач на персональном компьютере с использованием файлов на языке С++.

Теоретические сведения.

Под файлом обычно понимают упорядоченную совокупность произвольного числа компонент, расположенную на внешнем запоминающем устройстве, и имеющую единое имя, называемое физическим именем файла.

Файловая система, реализуемая в MS-DOSпредполагает, что файл может быть рассмотрен с двух точек зрения: как логический файл и как физический файл.

Логический файл (или файловая переменная, или поток) описывается как указатель на тип FILE. После того, как в программе объявлена файловая переменная, ее можно использовать как средство общения с физическим файлом.

В программах операции над файлами выполняются с помощью потоков. Поток

представляет объект, состоящий, подобно массивам или структурам, из компонентов, но который может быть расширен путем добавления новых компонентов.

По сути дела, операция над потоком реализуется как операция над файлом. Поэтому выполнению некоторой операции над потоком предшествует создание потока, открытие файла и связывание его с потоком. И лишь после этого все дальнейшие операции, в частности операции ввода-вывода, могут быть рассмотрены как операции над потоками.

Тот факт, что поток, связанный с некоторым файлом, является текстовым или двоичным, определяется во время открытия файла и влияет на способ выполнения операций над потоком.

Во время открытия файла создается поток, который связывается с файлом. При этом обеспечивается доступ к указателю, идентифицирующему поток, а затем и файл. Обычно этот указатель присваивается переменной типа FILE *, с помощью которой поток идентифицируется. В том случае, если открытие файла невозможно,

обеспечивается доступ к пустому указателю NULL.

Открытие файла.

Открытие файла осуществляется функцией

fopen(const char*name,const char*mode),имеющей два параметра:

- имя файла, который следует открыть;

- способ доступа к файлу.

В таблице 1 представлены возможные режимы или способы доступа к файлу.

Таблица 1.

Режим

Двоичный

Текстовый

Описание

R

rb

rt

Открывает существующий файл для чтения.

W

wb

wt

Создает новый файл для записи. Перезапи- cывает существующий файл с таким же

именем.

A

ab

at

Открывает существующий файл для присоединения к его концу новой информации.

R+

r+b

r+t

Открывает существующий файл для чтения и

записи.

W+

w+b

w+t

Создает новый файл для чтения и записи.

Перезаписывает существующий файл с таким же именем.

A+

a+b

a+t

Открывает существующий файл для присоединения к его концу новой информации.

Если файл не существует, создается новый файл с данным именем.

По умолчанию открывается текстовый файл. Для работы с двоичными файлами к режиму доступа следует добавить символ «b».

Различие между текстовым и двоичным потоком заключается в том, что текстовый поток состоит из строк, заканчивающихся символом ‘\n’, а двоичный поток - просто последовательность символов, интерпретируемых как их численное представление.

При использовании значения «w» в качестве режима доступа к существующему файлу, его старая версия стирается, и программа начинает запись файла на «пустом месте». Значение параметра «a» таких разрушительных действий не производит,

поскольку открывает файл для дозаписи и устанавливает указатель в файле на конец файла.

Указатель на файл является значением, возвращаемым функцией:

FILE *in;

in=fopen(«test», «r»);

Теперь in является указателем на файл «test». С этого момента программа ссылается на файл при помощи указателя in, который, по сути является файловой переменной, а не по имени «test». Указатель на файл, или его логическое имя,

идентифицирует поток.

Если функция fopen( ) не способна открыть требуемый файл, она возвращает значение «NULL», определенное в stdio.h как 0, поэтому вполне логично использование в программе следующей строки:

if ((in=open(«test», «r»))!=NULL)

Закрытие файла.

Закрытие файла - это по сути дела закрытие связанного с ним потока. Закрыть файл можно воспользовавшись функцией fclose(FILE *stream), где stream-указатель

на открытый поток.

Для приведенного примера закрытие файла произойдет по команде fclose(in);.

Следует обратить внимание на то, что в качестве аргумента стоит указатель на файл, а не имя файла.

Можно проверить успешность закрытия файла: функция fclose( ) возвращает значение 0, если файл закрыт успешно, и -1 в противном случае.

При работе с файлами используется буферированный ввод/вывод, то есть данные хранятся во временной области памяти, которая и является буфером.

Если буфер заполнился, содержимое его передается в блок, и процесс буферизации начинается снова. Одна из основных задач fclose( ) заключается в том, чтобы «освободить» любые частично заполненные буфера при закрытии файла.

Соседние файлы в папке Lab4