Информатика в задачах, примерах, алгоритмах
.pdf
11. Файлы. Работа с файлами
Типы файлов
Наиболее грубое деление файлов на группы — это программные файлы и файлы данных. Программные файлы содержат коды программ. Файлы данных — это информация, которая обрабатывается с помощью программ. Это тоже весьма условное деление, хотя бы потому, что программы для трансляторов являются файлами данных, поэтому правильнее называть программными файлами такие файлы, которые являются программами, то есть являются набором команд для какого-либо процессора. В дальнейшем, говоря о файлах, мы будем рассматривать только файлы данных.
Файлы данных подразделяются на три типа: последовательные, произвольного доступа и двоичные.
Âпоследовательном файле записи размещаются последовательно друг за другом. Чтобы получить (считать с диска) какую-то запись файла, необходимо прочитать все предыдущие записи этого файла.
Âфайлах произвольного доступа существует возможность доступа к произвольной записи, не затрагивая предыдущие и последующие записи данного файла, что значительно экономит время доступа к записи и возможность ее обновления (корректировки). Файлы произвольного доступа — это обычно файлы баз данных со структурированной информацией.
Âдвоичном файле информация записана как набор байтов. Обычно это исполняемые файлы.
11.1. Средства обработки файлов
Операторы работы с файлами
Последовательные файлы |
Произвольные файлы |
Что делает |
|
|
|
OPEN |
OPEN |
Открыть файл |
|
|
|
CLOSE |
CLOSE |
Закрыть файл |
|
|
|
Input # |
|
Прочитать запись из файла |
|
|
|
Print # |
|
Записать запись в файл |
|
|
|
Write # |
|
Записать запись в файл |
|
|
|
|
Get |
Прочитать запись |
|
|
|
131
Информатика в задачах, примерах, алгоритмах
Последовательные файлы |
Произвольные файлы |
|
Что делает |
|
|
|
|
|
Put |
Записать запись |
|
|
|
|
|
Loc |
Loc |
Определить позицию |
|
|
|
|
|
Lof |
Lof |
Вернуть длину файла |
|
|
|
|
|
|
|
Логическая величина, ука- |
|
Eof |
|
зывающая, достигнут ли ко- |
|
|
|
нец файла |
|
|
|
|
|
Fileattr |
|
Возвращает атрибуты файла |
|
|
|
|
|
|
|
Возвращает номер следую- |
|
Freefile |
|
ùåãî |
неиспользованного |
|
|
файла |
|
|
|
|
|
Одним из важнейших атрибутов файла является его имя. Имя файла состоит из имени дисковода, каталога (папки), идентификатора файл, — всего того, что позволяет найти файл на диске. Причем имя файла в DOS имеет следующие ограничения (в WINDOWS этих ограничений нет):
используются только английские буквы; не допускаются спецсимволы и пробелы.
Идентификатор файла — это непосредственное обозначение файла (в DOS не больше восьми символов) и его расширение, которое добавляется через точку и содержит не более трех символов.
Работа с файлами делится на три вида: создание (запись файла на диск); чтение файла и обработка записей файла;
добавление записей (расширение файла).
Для добавления (изменения) существующих записей в файлах с последовательным доступом требуется фактически переписать все записи файла заново, в том числе и те, которые не требовали изменения.
Файлы данных с произвольным доступом позволяют считывать данные в любом порядке, независимо от того, в какой последовательности они были записаны в файл. Запись и чтение файла выполняется в виде отдельных записей так же, как и в случае работы с последовательным файлом, но каждая запись имеет свой номер. Наличие номера позволяет обращаться непосредственно к необходимой записи файла. Максимальная длина записи 32 767 байт.
132
11. Файлы. Работа с файлами
11.2. Оператор OPEN
Оператор OPEN (открыть) выполняет определенную подготовительную работу для последующих операций ввода-вывода. Он заполняет блок управления данными, в который система помещает номер файла и номер устройства, с которым будет работать система; резервирует области оперативной памяти для буферов обмена операций ввода-вывода; определяет организацию данных в файле и режим его обработки и пр.
Формат записи оператора OPEN:
OPEN файл$ [FOR режим] [ACCESS доступ] [закр] AS [#]номер_файла% [LEN=ä_çàï%]
Ãäå:
Ôàéë$ |
имя файла или устройства. Имя файла может включать устрой- |
|
ñòâî è ïóòü. |
Режим |
определяет режим работы с файлом посредством ключевых слов |
|
APPEND |
|
указывает, что файл должен быть открыт для последовательного |
|
дополнения, и устанавливает указатель файла в конец файла. |
|
В этом случае операторы PRINT # или WRITE # дополняют файл. |
|
BINARY |
|
указывает бинарный режим файла. В бинарном режиме можно |
|
считывать или записывать информацию в позицию любого бай- |
|
та, используя операторы GET и PUT. |
|
INPUT |
|
указывает, что файл открыт для последовательного ввода. |
|
OUTPUT |
|
указывает, что файл открыт для последовательного вывода. |
|
RANDOM |
|
указывает, что файл открыт в режиме прямого доступа к файлу. |
|
Этот режим устанавливается по умолчанию. |
номер_файла |
номер в пределах от 1 до 255, идентифицирующий открытый |
|
файл в программе. |
Файл, который открывается для последовательного чтения, то есть с операндом INPUT, должен существовать на диске к моменту выполнения оператора OPEN, иначе выдается сообщение об ошибке.
133
Информатика в задачах, примерах, алгоритмах
Если файл открывается для последовательной записи данных из оперативной памяти, то есть с операндом OUTPUT, то при выполнении оператора OPEN система каждый раз создает новый файл, а старый уничтожает. Если файл данных с операндом OUTPUT уже открыт в программе, его нельзя повторно открыть в этой же программе, если не было закрытия файла (оператор CLOSE), иначе система выдает сообщение об ошибке.
При открытии несуществующего файла для его дополнения, т.е. с операндом APPEND, система создает новый файл с указанным именем. Новые данные в такой файл записываются в конец файла. При работе с последовательным файлом в режиме дополнения (APPEND) в нем сохраняются все ранее введенные данные.
11.3. Оператор CLOSE
Оператор CLOSE (закрыть) предназначен для закрытия файлов. Особенно важна операция закрытия для выходных (OUTPUT) и обновляемых (APPEND) файлов, потому что только операция закрытия обновляет таблицу файлов на диске. После закрытия файла его номер может быть использован в этой же программе для работы с другим файлом.
Формат записи оператора CLOSE:
CLOSE [[#]номер_файла%[,[#]номер_файла%]...]
Ãäå номер_файла% — номер открытого файла или устройства; CLOSE без аргументов закрывает все открытые файлы и устройства.
Пример
QÂasic
CLS
INPUT “Введите имя файла: ”, n$
OPEN n$ FOR OUTPUT AS #1
PRINT #1, “Это хранится в файле”
CLOSE
OPEN n$ FOR INPUT AS #1
INPUT #1, a$
PRINT “Чтение из файла: ”; a$
CLOSE
134
11. Файлы. Работа с файлами
Файлы закрывает не только оператор CLOSE. Операторы END, RESET, SYSTEM, RUN автоматически закрывают все открытые файлы.
11.4. Оператор WRITE#
Оператор WRITE (писать) записывает данные на экран или в последовательный файл.
Формат оператора WRITE:
WRITE [[#]номер_файла%,] выражение
Ãäå:
номер_файла% |
номер открытого последовательного файла. Если но- |
|
мер файла опущен, WRITE выводит данные на экран; |
выражение |
одна или несколько переменных или выражений, раз- |
|
деленных запятыми, значения которых записываются |
|
на экран или в файл. |
WRITE вставляет запятые между записями и заключает в кавычки строки в той последовательности, в которой они написаны, т.е. каждый элемент записи записывается на диск в виде символьной константы, все элементы одной записи отделяются друг от друга запятыми, а сама запись заканчивается символами “Возврат каретки” и “Перевод строки”. WRITE записывает значения в файл в той форме, которая может быть считана оператором INPUT. Перед положительным числом и после него пробелы не вставляются.
Пример.
CLS
OPEN “LIST” FOR OUTPUT AS #1
DO
INPUT “ ÈÌß: ”, Name$
INPUT “ ВОЗРАСТ: ”, Age$
WRITE #1, Name$, Age$
INPUT “Добавить еще”; R$
LOOP WHILE UCASE$(R$) = “Ä”
CLOSE #1
135
Информатика в задачах, примерах, алгоритмах
'Печать файла на экране.
OPEN “LIST” FOR INPUT AS #1 CLS
PRINT “Записи в файле:”: PRINT DO WHILE NOT EOF(1)
INPUT #1, Rec1$, Rec2$ 'Считывает записи из файла PRINT Rec1$, Rec2$ 'Печатает записи на экране
LOOP CLOSE #1 KILL “LIST”
11.5. Оператор INPUT#
INPUT(ввод) считывает входные данные с клавиатуры или из файла. LINE INPUT (ввод строки) считывает строку (до символа возврата каретки), содержащую до 255 символов, с клавиатуры или из файла.
Формат оператора INPUT:
INPUT [;] [“приглашение”{; | ,}] список переменных INPUT #номер файла%, список переменных
LINE INPUT [;] [“приглашение”;] переменная$ LINE INPUT #номер файла%, переменная$
Ãäå:
приглашение
список переменных
номер файла%
необязательная строка, отображаемая на экране перед вводом данных. Точка с запятой, стоящая сразу после приглашения, добавляет знак вопроса в строку приглашения, которая выводится на экран монитора;
одна или несколько переменных, разделенных запятыми, которые служат для хранения данных, вводимых с клавиатуры или считанных из файла. Имя переменной может состоять из 40 символов и должно начинаться с буквы латинского алфавита. Допустимыми являются символы A-Z, 0-9 и точка (.)
номер файла, открытого оператором OPEN.
INPUT использует запятую для разделения записей.
136
11. Файлы. Работа с файлами
При вводе с клавиатуры точка с запятой, стоящая сразу после оператора INPUT, оставляет курсор в той же строке при нажатии пользователем клавиши Enter.
Пример.
CLS
OPEN “LIST” FOR OUTPUT AS #1 DO
INPUT “ ÈÌß: ”, name$ 'Считывает символы с клавиатуры
INPUT “ ВОЗРАСТ: ”, age$ WRITE #1, name$, age$ INPUT “Продолжить”; R$
LOOP WHILE UCASE$(R$) = “Ä” CLOSE #1
'Просмотр файла.
OPEN “LIST” FOR INPUT AS #1 CLS
PRINT “Записи в файле:”: PRINT DO WHILE NOT EOF(1)
LINE INPUT #1, REC$ |
'Считывает записи из файла. |
PRINT REC$ |
'Печатает записи на экране |
LOOP |
|
CLOSE #1 |
|
KILL “LIST” |
'Уничтожает созданный файл |
11.6. Оператор PRINT# USING
Оператор PRINT# USING (напечатать по шаблону) записывает отформатированную запись на экран или в файл.
LPRINT USING печатает отформатированную запись на принтер LPT1.
Формат операторов:
PRINT [#номер_файла%,] USING символы_шаблона$; выражения [{; | ,}]
LPRINT USING символы_шаблона$; выражения [{; | ,}]
137
Информатика в задачах, примерах, алгоритмах
Ãäå:
номер_файла% |
номер файла, открытого оператором OPEN; |
символы_шаблона$ — |
символьное выражение, содержащее один и более оп- |
|
ределителей формата; |
выражения — |
одно или несколько числовых или символьных выра- |
|
жений, разделенных запятыми, точкой с запятой, про- |
|
белами или знаками табуляции; |
{; | ,} |
символы, которые определяют, где начинается следую- |
|
щий вывод: |
; |
печать сразу после последнего символа |
, |
печать в начале следующей зоны печати (Ширина зо- |
|
ны печати — 14 символов). |
Шаблон обеспечивает вывод данных в нестандартном формате. Шаблон представляет собой символьную константу или переменную и определяет вид, в котором все данные выводятся на экран монитора или записываются в файл.
11.7. Оператор PRINT #
PRINT # выводит данные в последовательный файл. LPRINT печатает данные на принтере LPT1.
Формат оператора PRINT#:
PRINT [#номер_файла%,] [выражения] [{; | ,}]
Ãäå:
номер_файла%
выражения
{; | ,}
;
,
номер файла, открытого оператором OPEN. Если номер файла не указан, PRINT выводит данные на экран;
одно или несколько числовых или символьных выражений для печати.
символы, которые определяют, где начинается следующий вывод:
печать сразу после последнего символа
печать в начале следующей зоны печати (Ширина зоны печати — 14 символов).
138
11. Файлы. Работа с файлами
Оператор PRINT# отличается от оператора WRITE# тем, что за один раз выводит одну запись, независимо от того, сколько переменных в нем указано, в то время, как оператор WRITE# для каждого указанного в нем выражения формирует отдельную запись. Поэтому, используя оператор PRINT#, программист должен сам заниматься позиционированием прочитанных записей, которые были записаны с помощью оператора PRINT#. Данный оператор удобно использовать при работе с одной переменной, хотя это и весьма условное удобство. Наилучшее его использование — это печатать на экране монитора или принтере.
Пример.
a$="abcd Проверка" b=10.789
оператор PRINT# a$,b создаст запись следующего вида: abcd Проверка 10.789
оператор PRINT# a$;b создаст запись следующего вида: abcd Проверка 10.789
а оператор WRITE# a$,b создаст две записи: “abcd Проверка” и “10.789”
11.8. Функция EOF
Функция EOF (End Of File — конец файла) проверяет, достигнут или нет при чтении файла признак конца файла. EOF возвращает “истинно” (не ноль) при достижении конца файла.
Формат записи функции:
EOF(номер_файла%)
Ãäå:
номер_файла% |
номер файла, открытого оператором OPEN. |
139
Информатика в задачах, примерах, алгоритмах
Пример 1.
CLS
OPEN “ÒÅÑÒ.ÄÀÍ” FOR OUTPUT AS #1
FOR i% = 1 TO 10
WRITE #1, i%, 2 * i%, 5 * i%
NEXT i%
CLOSE #1
OPEN “ÒÅÑÒ.ÄÀÍ” FOR INPUT AS #1
DO
LINE INPUT #1, a$
PRINT a$
LOOP UNTIL (EOF(1))
Пример 2. В текстовом файле поменять все слова Валерий на В.К.Алиев. Написать программу, которая создает такой текстовый файл на основе документа Word (Макрос для документа Word).
Sub ()
'В текстовом файле поменять все слова “Валерий” на '“В.К.Алиев”.
Dim s As String, s1 As String, i As Long, c As String * 1
Dim nsimb As Integer |
|
Dim chz As Integer |
'для числа замен |
'Открыть файл для чтения
Open “a:\Contr.txt” For Input As #1
'читаем файл в переменную s s = “”
Do While Not EOF(1)
c = Input(1, #1) 'читаем очередной символ s = s + c
Loop
140
