[an error occurred while processing this directive]

203

32 Обращение с файлом

Файл - это собрание информации, которую обычно хранят в одном месте для общей цели. В кабинете файлы могут быть в форме папок, коробок, микрофильмов или устройства памяти компьютера.

Хранение информации с помощью компьютера имеет много преимуществ, включая: быстроту доступа, простоту хранения и компактность.

Комал обладает операторами, которые делают хранение информации совсем простым процессом.

Мы можем пользоваться файлами двух типов.

32.1 Последовательные файлы

Один тип файла похож на папку бумаг. Каждый раз, когда в папку вкладывают еще один лист, его кладут на низ папки. Когда вы хотите найти что-нибудь в папке, вам приходится прелистывать листы, пока вы не найдете необходимый. Такой тип файла называется последовательным. Информация добавляется в файл последовательно и ее приходится брать тоже последовательно.

32.2 Файлы с произвольной выборкой.

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

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

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

.сс

204

32.3 Имена файлов

Каждый файл имеет свое имя, которое на дискетте может иметь до десяти букв. Символы не должны включать пробелы. На дискетте имя файла не должно включять в себя пунктуацию. Детальное описание дано в руководстве "Дисковая файловая система". Не нужно заключать имя файла в кавычки, если это не ключевое слово.

32.4 Номера файлов

При использовании файл имеет номер (от 0 до 5). Мы скорее пользуемся номером файла, чем его именем. Одновременно в пользовании может быть до пяти файлов.

32.5 закрытие файла

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

Файлы, которые были в работе, закрывает команда CLOSE. Отдельные файлы можно закрыть такой командой как CLOSE FILE 1.

32.5 Открытие последовательного файла

Файл может быть открыт для хранения информации с его начала (WRITE), для добавление информации в конце файла (APPEND), или для получения информации из файла (READ).

Оператор открытия последовательного файла имеет три части.

1. Номер файла (от 0 до 5).

2. Имя файла.

3. Цель, для которой открывается файл: READ или APPEND или WRITE.

Такая команда, как:

OPEN FILE 1, Tapes, WRITE

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

.сс

205

Такая команда, как:

OPEN FILE 2, Discs, READ

считывает информацию из файла с именем Discs, начиная с начала файла.

Такая команда, как:

OPEN FAJL 3, Books, APPEND

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

32.7 Размещение информации в файле

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

PRINT FILE 4:name¤

Если вы хотите поместить в файл несколько пунктов одновременно, то пункты отделяются запятыми, например:

PRINT FILE 4:name¤,address¤,town¤,code¤

В перечне пунктов могут быть использованы переменные, постоянные и выражения, например:

PRINT FILE 4:name¤,2*x,7,"Hi2

Вместо PRINT FILE можно использовать WRITE FILE, но только для хранения величин переменных, а не постоянных и выражений, например:

WRITE FILE 5: a¤,b,c#

Введите данную программу, создающую файл Randcol, который содержит 50 комплектов по три числа:

    10 OPEN FILE 1, Randcol, WRITE
    20 FOR set := 1 TO 50 DO
    30 c := RND( 7)
    40 x := RND ( 1279)
    50 y := RND ( 1032))
    60 PRINT c,x,y, // screen display only
    70 PRINT FILE 1:c,x,y // into file
    80 NEXT set
    )  CLOSE FILE 1 // MUST close fie

и сохраните ее под именем COL_IN для последующего использования.

.сс

206

32.8 Возвращение информации из файла

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

INPUT FILE 1: name¤

Если необходимо вывести несколько порций информации одновременно, то между названиями переменных, которым будет присваиваться инфармация, должны отделяться запятыми, например:

INPUT FILE 1:name¤,address¤,town¤,postcode¤

READ FILE имеет точно такое же действие, что и INPUT FILE.

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

   10 MODE := 3
   20 MOVE 640,512 // Middle of screen
   30 OPEN FILE 1,Randcol,READ
   40 FOR set := 1 TO 50 DO
   50   READ FILE 1:c,x,y
   60   GCOL 0,c // Graphics colour
   70   DRAW x,y
   80 NEXT set
   90 CLOSE FILE 1 /// MUST close file

Запустите программу.

.сс

207

32.9 EOF

Имеется функция EOF (End Of File - конец файла). За этой функцией должен следовать номер файла. Если в файле информации больше нет, то EOF возвращает TRUE. Если конец файла достигнут не был, то EOF возвращает FALSE.

Измените строки 40 и 80

   40 WHILE NOT EOF 1
   80 END WHILE

запустите программу снова.

Сохраните программу под именем COL_OUT.

32.10 Дополнение к последовательному файлу

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

Если вы можете предвидеть необходимость увеличения последовательного файла, то будет неплохо создать файл с дополнительными порциями фиктивной информации. Первым пунктом в файле может быть число фактических записей и максимально возможное число, которое может быть записано в файл. Число фактических записей может изменяться по мере того, как записывается истинная информация. Такой подход эффективен, но портит идею добавления. Как пример добавления введите следующую программу или прямо, или загрузив программу COL_IN, в которой необходимо изменить строку 10, чтобы использовать APPEND.

   10 OPEN FILE 1, Randcol, APPEND
   20 FOR set := 1 TO 50 DO
   30   c := RND( 7)
   40   x := RND( 1279)
   50   y:= RND ( 1023))
   60   PRINT c,x,y
   70   PRINT FILE 1:c,x,y
   80 NEXT set
   90 CLOSE FILE 1

Запустите программу.

.сс

208

32.11 Файлы с произвольной выборкой

При создании файлов с произвольной выборкой требуется организация большей степени. Каждая порция информации (или записи) может содержать несколько секций (или полей), например:

справочный номер, фамимилию, инициалы, причетающуюся сумму

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

32.12 Требуемая длина записи

Целое требует пять байтов.

Любое другое действительное число требует шесть байтов.

Каждая строка требует на два байта больше, чем длина строки (один байт, чтобы указать, что это строка и один байт для установки длины строки).

В качестве примера мы можем выработать длину, необходимую для записи, состоящей из:

- справочного номера, котрый может иметь до 8 цифр;

- фамилии, которая может иметь до 20 букв;

- комплект инициалов, который может иметь до 5 букв;

- причитающаяся сумма, которая может быть до 10,000.00.

Справочный номер - это целое число, которому нужно 5 байтов; фамилия - это строка, требующая 20 + 2 байта; фамилия - это срока, требующая 5 + 2 байта; причитающаяся сумма - это действительное число, требующее 6 байтов.

Общая длина записи составить 5 + 22 + 7 + 6 = 40.

Когда мы открываем файл случайного доступа, мы должны объявить длину, равную 40.

.сс

209

32.13 Как открывать файлы с произвольной выборкой

За ключевыми словами OPEN FILE должен следовать номер файла (от 0 до 5), запятая, затем имя файла, запятая, слово RANDOM и число, или логическое выражение для длины записи. Например:

OPEN FILE 1, Invoice, RANDOM 40

Читать или записывать

Открытый файл с произвольной выборкой можно использовать для чтения или письма, если в конце команды открытия файла не стоят ключевые слова READ ONLY (между ними точно один пробел). Наример:

OPEN FILE 2, Payment, RANDOM 40 READ ONLY

Между длиной записи и командой READ ONLY запятую ставить не нужно.

32.14 Помещение данных в файлах с произвольной выборкой

Задаются ключевые слова PRINT FILE и номер файла. Затем следуют запятая, номер записи и двоеточие. Пункты, помещаемые в запись, отделяются запятыми. Например:

PRINT FALE 1,record#:refer#<name¤,initial¤,amount

PRINT FAJL позволяет использовать переменные и выражения для номера записи и пунктов. Если в файл помещаются только величины переменных, а не выражения, то можно использовать WRITE FILE.

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

Введите

   10 DATA 12345678,Jones,ABC,111.11
   20 DATA 13579135,Smith,DEF,222.22
   30 DATA 24680246,Brown,GHI,333.33
   40 DATA 56789012,Evanse,ACV,123.45
   50 //
   60 OPEN FILE 1,Bills,RANDOM 40
   70 record# := 0
   80 REPEAT
   90   READ refer#,name¤,initial¤,amount
  100   record# :+ 1
  110   PRINT FILE 1,record#:refer#,name¤,initial¤,amount
  120   PRINT name¤;" ";initial¤;TAB( 20);refer#,amount

.сс

210

  130 UNTIL EOD
  140 SLOSE FILE 1 // MUST close file

Запустите программу.

35.15 Выборка данных из файла с произвольной выборкой

Ключевые слова INPUT FILE могут быть использованы для выборки данных из файла.

За INPUT FILE следуют номер файла, запятая, номер записи и двоеточие. Затем дается список пунктов, выбираемых из файла, которые отделяются запятыми, например:

INPUT FILE 2,record#:refer#,name¤,,initial¤,amount

Вместо INPUT FILE можно использовать команду READ FILE.

Введите следующую программу:

  100 MODE := 6
  110 PRINT TAB( 0,,2)
  120 INPUT "Which record? " :record#
  130 //
  140 OPEN FILE 2,Bills,RANDOM,, 40 READ ONLY
  150 INPUT FILE 2,record#:refer#,name¤,initial¤,amount
  160 CLS
  170 CLOSE FILE 2
  180 //
  190 PRINT 'name¤;" ";initial¤
  200 PRINT "Reference number ";refer#
  210 PRINT "Amount owing>>> ";amount

Запустите программу несколько раз, используя различные записи.

Доступ к записям - прямой. Нам не нужно перечитывать все до требуемой информации.

32.16 Обработка по мере поступления

Производить непрерывную обработку данных очень просто. Пока файл открыт, данные можно читать, обрабатывать и записывать обратно (при условии, что файл не был открыт только для READ ONLY). В качестве примера мы можем изменить причетающуюся сумму от одного из абонентов в нашем файле с произвольной выборкой. Измените 140 на

  140 OPEN FILE 2,"Bills",RANDOM 40

(убрав только ограничение READ ONLY).

.сс

211

Уничтожьте строку 160 и добавьте следующее

  220 PRINT '"How much extra > ";
  230 INPUT extra
  240 owing := amount + extra
  250 PRINT '"New balance >";owing
  270 CLOSE FILE 2

Запустите программу несколько раз, чтобы посмотреть как меняется один и тот же счет.

В практике, при выполнении такой процедуры, необходимо тщательно хранить исходную сумму и перерасчеты, которые вызвали изменения.

Можно организовать файл переращетов, а также новый файл измененных сумм. Это можно сделать или с помощью файла произвольного выбора, или последовательного файла.

Если прерасчеты размещаются в той же последовательности, что и записи, то непрерывная обработка может выполнятся с последовательным файлом. Исходный файл может быть прочитан и записи скопированы или прямо в новый файл, или изменены, а затем записаны.

32.17 EXTent (эксент, величина) файла

EXT - это функция, которая возвращает размер файла. После EXT необходимо дать номер файла, напр. PRINT EXT 2.

Если файл не открыт, выдается сообщение об ошибке.

32.18 Дополнительные записи

Файл с произвольной выборкой можно расширить только, если на дискетте в конце файла имеется достаточно пространства. Если вы предполагаете сделать на некотором этапе дополнительные записи, то поступите мудро, создав целый дополнительный файл. Это можно сделать, впечатав несколко величин в последнюю нужную запись. Таким образом зарезервируется пространство для всех последующих записей.

Пример:

   10 OPEN FILE 1,BILLS, RANDOM 40
   20 PRINT FILE 1,100:999999,"ZZZZZ","ZZ",0
   30 CLOSE FILE 1

что создаст файл с именем BILLS, резервирующий пространнство от 0 до 100 для записей. Запись 100 будет содержать фиктивную информацию, приведенную в строке 20.

.сс

[an error occurred while processing this directive]