НОВОСТИ   БИБЛИОТЕКА   ЮМОР   КАРТА САЙТА   ССЫЛКИ   О САЙТЕ  




предыдущая главасодержаниеследующая глава

21. Файлы (FILE)

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

Пример. Пусть записывающая головка (изобразим ее стрелкой) установлена против участка А магнитной ленты (рис. 2):

Рис. 2
Рис. 2

Если на ленту будет записано некоторое число 153, то головка после записи переместится к следующему участку ленты (В) (рис. 3):

Рис. 3
Рис. 3

Пусть на ленту таким образом будет записана последовательность чисел: 153, 512, 25, -13 (рис. 4)

Рис. 4
Рис. 4

В этом случае говорят, что на магнитной ленте находится файл (переменная типа FILE) длиной 4, а записывающая головка продвинулась за пределы файла.

Файл представляет собой последовательность компонент одного и того же типа. Число компонент не фиксировано. В каждый момент доступна только одна компонента. Говорят, что на эту компоненту установлен указатель файла.

Если выполнилась операция записи в n-ю компоненту файла, то указатель автоматически продвигается к (n + 1)-й компоненте, т. е. для записи становится доступной уже только (n + 1)-я компонента.

Длиной файла называется число записанных компонент. Файл, не содержащий компонент, называется пустым, его длина равна нулю. Читать файл можно также только последовательно по одной компоненте. Файлы паскаля поэтому называют файлами последовательного доступа. Начать писать в файл можно только с самого его на чала, дописывая новые компоненты последовательно одну за другой; для чтения также надо начинать просмотр файла с самого начала.

Вследствие такой организации па одном просмотре файла нельзя совмещать и чтение, и запись информации: можно либо только читать, либо только писать.

Для того чтобы определять готовность файла к чтению либо к записи информации, существует стандартная функция EOF(F), где F - имя файла. Если указатель файла продвинулся за конец файла (готовность к записи), то эта функция принимает значение TRUE, во всех остальных случаях эта функция принимает значение FALSE.

Общий вид описания типа FILE:


здесь R - идентификатор типа, ТС - тип компонент (может быть любым, кроме типа FILE).

Файлы могут быть разных типов: состоять из целых компонент, либо вещественных, либо записей и т. д. Как и другие переменные, каждую переменную-файл надо описать в разделе VAR. Вводя имя переменной файла (имя файла), надо указать, какого типа файл. Этот тип должен быть обозначен каким-либо именем и описан в разделе TYPE.

Например, файл F вещественных чисел:


Файл может быть описан и непосредственно при описании переменной, например


В первом случае введено имя файла F и соответствующий тип обозначен N; во втором введено имя файла F, а его тип имени не имеет и поэтому в разделе TYPE не описывается.

Если переменная F имеет тип FILE, то транслятор автоматически вводит переменную Ff, называемую буферной переменной, "окном", через которое можно прочитать или записать одну компоненту. Переменная F↑ имеет тот же тип, что и компоненты файла F. "Окно" устанавливается против той компоненты, где находится указатель файла.

Пример. Рассмотрим на схеме запись в файл чисел 153, 612, 25.


В "окно" F↑ записано число 153.


Выполнен приказ на запись в файл. Значение FJ "испорчено", там уже не 153.


В "окно" занесено число 512.


Выполнен приказ на запись в файл.


В окно занесено число 25.


Выполнен приказ на запись в файл.

После записи в файл значение буферной переменной F↑ становится неопределенным ("портится").

Файлы создаются не только на магнитных лентах, но и на магнитных дисках, других внешних устройствах, а также в оперативной памяти. Способы работы с такими файлами с точки зрения программы во всех этих случаях одинаковы: доступна только одна компонента файла (посредством "окна"). Файлы прямого доступа в стандарте языка паскаль отсутствуют [4].

Работа с файлами (F) проводится посредством следующих стандартных процедур.

1. RESET(F) - подготовка к чтению информации из файла с именем F. Эта процедура осуществляет следующие действия: если файл не пустой, то устанавливается указатель файла на 1-ю компоненту и эта компонента считывается в "окно" (F↑); функции EOF(F)

присваивается значение FALSE. Если файл был пустым, то значение F↑ "портится", a EOF(F) присваивается значение TRUE.

2. GET(F) - чтение компоненты файла F. Процедура выполняется только при условии, если EOF(F) имеет значение FALSE. Проверку этого условия необходимо сделать в программе перед обращением к GET(F). Процедура продвигает указатель к следующей компоненте файла и считывает эту компоненту в "окно" (F↑); если указатель выйдет за пределы файла, то функция EOF(F) принимает значение TRUE, а значение F↑ "испортится".

3. REWRITE(F) - подготовка к записи информации в начало файла F. Процедура очищает файл F и устанавливает указатель файла на 1-ю компоненту; функции'EOF(F) присваивается значение TRUE.

4. PUT(F) - запись компоненты в файл F. Перед обращением к этой процедуре в программе необходимо проверить значение функции EOF(F): файл готов к записи только при значении TRUE. Процедура записывает в файл значение буферной переменной (F↑) и передвигает указатель за пределы файла, готовясь записать следующую компоненту. Значение EOF(F) остается TRUE, a F↑ - "портится".

Пример. Проиллюстрируем на примере работу процедур REWRITE и PUT для следующей задачи: записать в начало файла GRUPP2 следующие компоненты:


Очевидно, файл содержит компоненты типа ALFA (см. 6.5.1), буферная переменная также типа ALFA. (Файл GRUPP2 содержал ранее другие значения).

1) Выполним процедуру REWRITE (GRUPP2):


2) Занесем 1-е значение в буферную переменную


3) Выполним процедуру PUT (GRUPP2);


4) Занесем 2-е значение в буферную переменную:


5) Выполним процедуру PUT (GRUPP2);


Для упрощения работы с файлами введены процедуры чтения информации из файла - READ и записи в файл - WRITE, которые освобождают программиста от манипуляций с буферной переменной. Общий вид:


здесь F - имя файла, XI, Х2, . . XN - переменные, куда считываются компоненты файла, начиная с той компоненты, какая была занесена в "окно" файла.

Пример. Пусть состояние файла GRUPP2 соответствует схеме


Тогда после выполнения оператора


(где Х1,Х2,ХЗ должны иметь тип ALFA) картинка будет выглядеть так:


Значения переменных Х1, Х2, Х3 будут следующими:


Процедура записи в файл имеет вид


Здесь F имя файла, А1, А2, . . . Аn - выражения того же типа, что и компоненты файла. Процедура записывает значения выражений А1 . . Аk по одному в файл:F, начиная с того места, куда был установлен указатель файла в момент обращения к процедуре WRITE.

Пример. Пусть Al='TEVELEV_'; A2='RODIONOV' А3='MALYSHEV', а состояние файла GRUPP2 такое, каким оно было после выполнения оператора READ. Тогда после работы оператора WRITE(GRUPP2,A1,A2,A3) файл GRUPP2 будет таким:


В стандарте языка паскаль работа с файлами через READ и WRITE допускается только для компонент, имеющих тип GHAR. Но трансляторы на ЕС ЭВМ и БЭСМ-6 не накладывают ограничений: для любых файлов можно использовать эти процедуры.

В качестве примеров рассмотрим три задачи, имеющие практическое значение.

Пример 1. Запись информации в файл F1 (переменная X должна иметь тип компонент файла). Фрагмент программы такой:


Пример 2. Чтение всей информации из файла F2 (переменная Y должна иметь тип компонент файла F2).


Пример 3. Записать в файл F1 числа 2, 3, 4, 5, а в файл F2 числа 2!, 3!, 4!, 5! Затем прочитать из файлов F1 и F2 эти числа и напечатать.



Результат работы программы:


Пример 4. Копирование файла F2 в файл F1. Компоненты файлов F1 и F2, а также переменная X должны иметь один и тот же тип.


предыдущая главасодержаниеследующая глава








© Злыгостев А.С., 2001-2019
При использовании материалов сайта активная ссылка обязательна:
http://informaticslib.ru/ 'Библиотека по информатике'
Рейтинг@Mail.ru
Поможем с курсовой, контрольной, дипломной
1500+ квалифицированных специалистов готовы вам помочь