Страница 35 из 41
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 'переход к следующей группе
|