Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Чтение из последовательных файлов

ОГЛАВЛЕНИЕ

     5.4.4 Чтение из последовательных файлов.


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

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

   Высокий уровень.


   Чтение последовательных файлов в Бейсике проще, чем их запись,
поскольку  имеется только две возможности, как обращаться с ними,
в зависимости от того, какие  символы  в файле используются в ка-
честве ограничителей элементов данных. Оператор INPUT# распознает
запятые и  кавычки,  как  разделители  данных,  так же как и пары
возврат каретки/перевод строки.  Оператор LINE INPUT#  распознает
только  комбинации  CR/LF,  поэтому  он  может использоваться для
чтения  целых строк текста, содержащих другие ограничители.   Эта
возможность удобна при обработке текстов.
   Для чтения трех элементов оператором  INPUT#, сначала откройте
файл,  как обсуждалось в [5.3.3] (например, OPEN  "A:NEWSEQ"  FOR
INPUT AS #1). Если файл  был  открыт  под  номером 1, то оператор
INPUT  #1,  X$, Y$, Z$ присвоит значение  первых  трех  элементов
данных трем строковым переменным.  При вводе числовых переменных,
например,  INPUT  #1, X, Y, Z необходимо,  чтобы  соответствующие
данные в файле были числовыми.   Число с двойной точностью должно
считываться  в переменную двойной точности, с тем чтобы она могла
хранить восемь байтов такого  числа.  Другой способ прочитать три
элемента данных состоит в размещении их в массиве:

100 DIM ITEM$(40)       'создаем массив строк из 40 элементов
110 FOR N = 0 TO 39     'для каждого элемента
120 INPUT #1, ITEM$(N)  'считываем его и помещаем в массив
130 NEXT                '

Чтобы  прочитать n-ный элемент последовательного файла  программа
должна прочитать все  предшествующие  ему  элементы.  Надо просто
создать цикл, в котором будут считываться элементы данных, но  не
сохранять эти данные по мере их появления.
   Оператор LINE INPUT# действует в основном аналогично оператору
INPUT#,  за исключением того, что он может принимать только  одну
переменную и это всегда  строковая  переменная.  Переменная может
быть  длиной до 254 символов и это максимально допустимый  размер
строковых переменных  в  Бейсике.   Пара  возврат каретки/перевод
строки,  содержащаяся в файле, включается в строку,  возвращаемую
оператором LINE INPUT#. Это свойство позволяет обнаруживать конец
параграфа в текстовом файле.
   Функция  EOF (конец файла) может быть использована для опреде-
ления того, все ли  элементы  файла  были  прочитаны. Эта функция
возвращает -1, если файл исчерпан и 0 - в противном случае. Функ-
ции требуется номер файла, под  которым  он был открыт; например,
если  был был открыт как #2, то X = EOF(2).  В следующем  примере
весь текстовый файл считывается в массив:

100 OPEN "TEXT.AAA" FOR INPUT AS #2   'открываем файл
110 DIM TEXT$(500)                    'не более 500 строк
120 LINECOUNT = 0                     'счетчик строк

130 LINE INPUT #2, TEXT$(LINECOUNT)   'получаем строку
140 IF EOF(2) THEN 170                'проверка на конец файла
150 LINECOUNT = LINECOUNT + 1         'увеличиваем счетчик
160 GOTO 130                          'на следующую строку
170 ...                               'файл прочитан

   Оператор INPUT$ читает  из  последовательного  файла указанное
число символов.  На самой программе лежит забота о выделении  от-
дельных элементов  данных.  Формат  этого оператора для чтения 30
символов  из файла #1 такой: S$ = INPUT$(30,#1).  Хотя Вы  можете
указывать число байт для  чтения,  необходимо  чтобы это число не
превосходило  254,  поскольку это максимальный  размер  строковой
переменной, в которую помещаются данные. INPUT$ полезен при пере-
даче массы данных в непрерывную область памяти.  Например, в сле-
дующем примере делается дамп  первых 200 байтов последовательного
файла в буфер монохромного дисплея, с тем чтобы они были выведены
на экран, включая управляющие коды:

100 OPEN "A:NEWFILE" FOR INPUT AS #1   'открываем файл
110 CLS: DEF SEG = &HB000              'указываем на буфер
120 FOR N = 0 TO 9                     'получаем 10 групп
130 S$ = INPUT$(20,#1)                 'по 20 байтов
140 FOR M = 1 TO 20                    'берем каждый байт
150 POKE N*160 + M*2, ASC(MID$(S$,M,1) 'и помещаем его в буфер
160 NEXT M       'переход к следующему байту
170 NEXT N       'переход к следующей группе