Справочник программиста на персональном компьютере фирмы 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 'переход к следующей группе