[an error occurred while processing this directive]

.сс

.шп6

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

.шп0

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

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

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

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

.шп14

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

.шп0

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

.шп14

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

.шп0

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

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

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

.шп14

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

.шп0

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

.шп14

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

.шп0

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

.шп14

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

.шп0

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

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

шп14

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

.шп0

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

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

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

2. Имя файла.

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

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

OPEN FILE 1, Tapes, WRITE

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

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

OPEN FILE 2, Discs, READ

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

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

OPEN FAJL 3, Books, APPEND

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

.шп14

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

.шп0

Когда вы хотите поместить информацию в файл, можно использовать команду 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 для последующего использования

.шп14

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

.шп0

Каждый раз, когда вы хотите вернуть информацию из файла, его необходимо открыть (и закрыть) таким же способом, как и при записи, только в этом случае в конце оператора 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

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

.шп14

32.9  EOF

.шп0

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

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

   40 WHILE NOT EOF 1
   80 END WHILE

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

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

.шп14

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

.шп0

На дискетте к концу существующего файла можно добавить дальнейшую информацию с помощью ключевого слова 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

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

.шп14

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

.шп0

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

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

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

.шп14

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

.шп0

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

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

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

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

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

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

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

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

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

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

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

.шп14

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

.шп0

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

OPEN FILE 1, Invoice, RANDOM 40

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

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

OPEN FILE 2, Payment, RANDOM 40 READ ONLY

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

.шп14

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

.шп0

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

PRINT FILE 1,record#:refer#,name¤,initial¤,amount

PRINT FILE позволяет использовать переменные и выражения для номера записи и объектов. Если в файл помещаются только величины переменных, а не выражения, то можно использовать 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
  130 UNTIL EOD
  140 SLOSE FILE 1 // MUST close file

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

.шп14

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

.шп0

Ключевые слова 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

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

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

.шп14

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

.шп0

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

  140 OPEN FILE 2,"Bills",RANDOM 40

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

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

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

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

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

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

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

.шп14

32.17 EXTent (размер) файла

.шп0

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

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

.шп14

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

.шп0

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

Пример:

   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.

.ст комал14

[an error occurred while processing this directive]