Главная » Basic » РАБОТА С ПОСЛЕДОВАТЕЛЬНЫМИ ФАЙЛАМИ

0

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

ранящихся в операторах DATA, существует немалое сходство. В случае файла вместо  оператора READ используется расширенный вариант оператора INPUT, а элементы данных исчезают из поля зрения и запоминаются аналогичным образом в последовательном файле.

Чтобы обеспечить гибкость манипулирования файлами, в Бейсике используется идея  логического номера, привязанного к файлу, благодаря чему во всех операторах чтения и записи, работающих с этим файлом, достаточно указывать только его логический номер. Перед началом работы с файлами или перед исполнением программы посредством одного оператора или команды (например, OPEN) осуществляется привязка существующего файла к логическому номеру, например:

10   REM ПРИМЕР РАБОТЫ С ФАЙЛОМ

20   OPEN 1,1,0,"INFO"

30   INPUT #1,A,B,C

Приведенный  выше  пример  специфичен  для  конкретной  системы  (PET),  но   тем   не   менее иллюстрирует привязку в строке 20 файла INFO к логическому номеру 1 (первая  единица после OPEN). В строке 30 показан расширенный оператор INPUT, считывающий значения переменных А, В и С из файла, привязанного к номеру 1. Детали открытия файла и  его привязка к логическому номеру будут приведены в  последующих разделах данной главы.  Перед исполнением примеров можно обратиться к соответствующему разделу в зависимости  от  используемой Вами системы и носителя информации архивной памяти.

Обозначение логического номера файла

Общая форма записи:

#N: или #N,

где N целочисленное выражение, переменная или константа.

В некоторых системах существуют ограничения для номера N, например: 1 <=N<=15 для Бейсика

Microsoft, 1<=N<=255 для персональной ЭВМ PET, 1<=N<=6 для ЭВМ ICL 2904

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

замечание.  Бейсик  ВВС  отличается  тем,  что  значение  N  не  выбирается  программистом,   а предоставляется системой при привязке файла к программе.

Приведенные ниже операторы могут применяться для работы с последова-

тельным файлом, если добавлять в них обозначение логического номера файла: INPUT #N, LINPUT #N, LINEINPUT #N, GET #N, PRINT #N, PRINT #N, USING

Приведем пример программы, действия которой состоят из  двух этапов. На первом  происходит запись в простой файл, а на втором — считывание данных обратно в память и изображение их на ВТУ. Так как Вы не можете "видеть", что именно запомнено в файле на  ленте или диске, то надо иметь средства проверки его содержимого, что и обеспечивается второй частью программы.

10 REM СОЗДАНИЕ И ПРОСМОТР ФАЙЛА

20 REM **ЗАМЕНИТЕ ЭТОТ КОММЕНТАРИЙ НА ОПЕРАТОР OPEN**

30 FOR I=1 ТО 50

40   PRINT «2,I*I

50 NEXT I

60 CLOSE 2

70 PRINT "ФАЙЛ ЗАПИСАН"

80 PRINT

90 PRINT "ПЕРЕМОТАЙТЕ ЛЕНТУ И НАБЕРИТЕ RUN 120" 100 STOP

110 REM ПРОСМОТР ФАЙЛА

120 REM **ЗАМЕНИТЕ ЭТОТ КОММЕНТАРИЙ НА ОПЕРАТОР OPEN**

130 FOR K=1 TO 50

140   INPUT #3,X

150   PRINT X;

160 NEXT К

170 CLOSE 3

180 END

Строки 20 и 120 должны быть заменены на соответствующие операторы OPEN для работы с одним и тем же файлом. Для иллюстрации логический номер 2 использован при записи в файл, а 3 —  при чтении из него; этот выбор совершенно произволен.

В системе ВВС надо использовать операторы

40   PRINT #N,I*I и 140   INPUT #N,X

где N берется из операторов OPEN (см. подразд. 8.4.4). Так как в системе ВВС в операторе  RUN номер строки указать нельзя, то приведенную выше программу лучше всего разбить на  две: одну составить из строк 10—100, а другую — из строк 110—180.

Действие первой части программы состоит в записи квадратов чисел от 1 до 50 в файл.  Каждый оператор PRINT добавляет в файл новую запись (зрительно ее можно представлять в виде строки). По команде RUN программа

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

RUN

ФАЙЛ ЗАПИСАН

ПЕРЕМОТАЙТЕ ЛЕНТУ И ДАЙТЕ КОМАНДУ RUN 120

RUN 120

1   4   9   16   25   36   49   64   81   100   121   144 169 (и т. д.)

Вы можете заметить небольшую паузу в процессе вывода после изображения части чисел на экране ВТУ. Она вызывается буферизацией, которая в том или ином виде применяется при работе со всеми файлами данных. Во всех системах для каждого устройства вывода в памяти выделяется  буферная область. У микроЭВМ  размер  этой области обычно составляет 128 или 256 байт. Данные, которые должны быть записаны в файл, собираются в этой буферной области до  ее заполнения, затем все содержание буфера целым блоком передается устройству. После этого  буфер готов принять новые данные и т. д. Аналогичным образом при вводе каждый  физический  блок, считываемый в ЭВМ, попадает в буфер;  программа читает данные из этого буфера до тех пор, пока он не станет пустым, после чего с ленты или диска считывается новый блок. Упомянутая выше пауза свидетельствует о том, что программа ждет, пока буфер не  заполнится новыми данными, считываемыми из внешней памяти на ленте или диске. Один из  способов избежать подобной неравномерности действий — применение двух буферов таким образом, чтобы один из них заполнялся данными в  то время, когда из другого извлекаются данные, и наоборот. Однако такой режим средствами Бейсика осуществить нельзя.

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

10 REM РАБОТА С ФАЙЛОМ ПРИМЕР 2

20 КЕМ «««ЗАМЕНИТЕ ЭТОТ КОММЕНТАРИЙ НА ОПЕРАТОР OPEN***

30 FOR I=1 то 50

40   PRINT #2,1;",";100*I

50 NEXT I

60   CLOSE 2

70   PRINT "ФАЙЛ ЗАПИСАН"

80   PRINT

90   PRINT "ПЕРЕМОТАЙТЕ ЛЕНТУ И НАБЕРИТЕ RUN 120"

100 STOP

110 REM ПРОСМОТР ФАЙЛА

120 RЕМ ***ЗАМЕНИТЕ ЭТОТ КОММЕНТАРИЙ НА ОПЕРАТОР OPEN***

130 FOR K=1 TO 50

140   INPUT #3,X,Y

150   PRINT X,Y

l60 NEXT K

170 CLOSE 3

180 END

RUN

ФАЙЛ ЗАПИСАН

ПЕРЕМОТАЙТЕ ЛЕНТУ И НАБЕРИТЕ RON 120

RUN 120

1                            400 (и т. д.)

Результаты исполнения соответствуют ожидаемым, так как в строке 40 выводятся два значения, I и 100*I, а в строке 140 они считываются обратно. Вернемся к строке 40 и обратим внимание на то, что в  файл посылается также значение ",".  Это  делается потому, что  операторы INPUT# и  PRINT# фактически работают так же, как и исходные версии INPUT и PRINT. Это означает,  что  оператор INPUT  ожидает  в  одной  строке  (или  записи)  получить  все  значения,   разделенные  запятыми. Например, оператор

10   INPUT SUM, ТОТ, Е ожидает получения ввода с клавиатуры в форме

? 10,-6,42

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

40   PRINT #2,I; 100*I Запустив программу вновь, Вы получите

RUN

ФАЙЛ ЗАПИСАН

ПЕРЕМОТАЙТЕ ЛЕНТУ И ДАЙТЕ КОМАНДУ RUN 120

RUN 120

1100      2200 3300      4400

(и т. д.) ERROR AT LINE 140

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

Важно иметь возможность обнаруживать конец файла, так как на практике точное число элементов данных в файле не известно. В некоторых системах для обнаружения конца файла  предусмотрена функция EOF ( ) :

Бейсик Microsoft: EOF(N) = -1 (ИСТИНА), если достигнут конец файла Бейсик ВВС:          EOF # (N) = -1 (ИСТИНА), если достигнут конец файла В других системах для этого предусмотрен специальный оператор IF:

ICL 2904: IF END# 1 GOTO 200

В некоторых системах имеется специальное слово состояния, значение которого зависит от реакции системы  на  каждый  обмен  данными.  В  персональной  ЭВМ  PET  имеется  слово  состояния  ST (размером в 1 байт) , и при различных реакциях в этом слове устанавливаются  (т. е. принимают значение 1) разные биты:

PET:  СЛОВО СОСТОЯНИЯ ST = 0, если все в порядке

= 64, если от кассетного магнитофона получен сигнал конца файла

100   REM ФРАГМЕНТ РАБОТЫ С ФАЙЛОМ ДЛЯ ЭВМ PET

110   INPUT #2, А,В,С

120   IF ST=0 THEN 200

130   IF ST=64 THEN 500

Переход к строке 200 отвечает нормальной обработке, а к строке 500 — действиям, выполняемым при обнаружении конца файла. Слово состояния имеет то преимущество, что в нем можно отмечать целый спектр возможных реакций и тем самым делать их доступными программе на Бейсике. Используя функцию Бейсика ВВС, можно привести пример обнаружения конца файла, содержащего список фамилий и чисел. Здесь был бы нужен цикл DO WHILE NOT EOF#N, но в Бейсике ВВС его нет.

100 REM ЧТЕНИЕ ДАННЫХ ИЗ ФАЙЛА ВВС С ЛОГИЧЕСКИМ НОМЕРОМ N

110 IF EOF#(N) THEN

120 INPUT#N , NAME$ , NUMB

. Процесс ввода

200   GOTO   110

210   REM ВЫХОД ПРИ  ОБНАРУЖЕНИИ КОНЦА  ФАЙЛА

220   CLOSE#N

Обратите внимание на некоторое отличие оператора CLOSE в Бейсике ВВС от обычно используемой формы.

8.3.1.  ФАЙЛЫ НА МАГНИТНОЙ КАССЕТЕ

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

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

ЭВМ умеет разбираться в том, какая из клавиш была нажата (если была), но лучше всего, если ЭВМ обладает возможностью полного управления чтением, записью и перемоткой ленты.

Обычная процедура работы с файлом такова: когда после запуска программы достигается оператор OPEN  (или  аналогичный  ему),  то  система  должна  затребовать  включение   магнитофона.  Под управлением ЭВМ двигатель лентопротяжного устройства должен  включаться  и выключаться при каждой передаче данных, и так до тех пор, пока, наконец, не будет достигнут оператор CLOSE. Ниже на примере двух систем проиллюстрированы общие свойства процесса работы с файлами данных на кассете.

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии