Как работать с файлами (Бейсик)

Общие положения

 

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

Средства обработки файлов, имеющиеся в языке BASIC, резко расширяют ваши возможности.

Чтобы начать работу с файлом, прежде всего надо его открыть — оператором OPEN. После этого вы можете выдавать либо команды чтения очередной порции байтов из файла -оператором INPUT, либо команды записи в файл очередной порции байтов — оператором PRINT.

Работая с файлами в среде QBASIC (как и в любой другой среде), необходимо помнить, что программа различает файлы по двум признакам: по типу и по способу доступа к байтам, записанным в файле.

1. Файлы можно разделить по типу на текстовые и нетекстовые (двоичные). Там же подчеркнута условность этого деления: любой текстовый файл программист может считать и двоичным (но не наоборот).

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

В текстовом файле записью считается знакомая вам строка файла, т. е. последовательность байтов до разделителей - символов Возврат каретки (код 13) и "Новая строка" (код 10). Эти символы в запись не включаются.

По умолчанию QBASIC считает файлы текстовыми, т. с. читает порцию байтов до символов 13 и 10, а при записи очередной порции байтов автоматически добавляет в ее конец символы 13 и 10.

Если вы явно объявили файл двоичным (BINARY), программа перестает отличать обычные символы от разделителей. Вы должны явно указывать длину записи в байтах (например, 14, 68, 160), и компьютер механически пересылает указанную вами битовую конфигурацию в программу (при чтении) или на диск (при записи), не интересуясь их смыслом.

2. Программа различает файлы последовательного доступа (INPUT, OUTPUT, APPEND) и файлы произвольного доступа (RANDOM)

Если файл открыт как последовательный, вы можете либо читать записи последовательно, одну за другой, начиная с первой (INPUT), либо формировать новый файл из последовательных записей (OUTPUT), либо дописывать записи одну за другой в конец существующего файла (APPEND)

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

Мы будем рассматривать только текстовые файлы последовательного доступа, открываемые как входные (для чтения -INPUT) или как выходные (для записи - OUTPUT). На рис. 3.30 показаны стандартные схемы обработки файла последовательного доступа.

Рис. 3.30

3.21.2. Техника работы с файлом

Для открытия файла используется оператор OPEN:

OPEN имя файла FOR режим AS #N

Имя файла — обычная строка символов, режим — ключевое слово INPUT (входной) или OUTPUT (выходной), N — порядковый номер открываемого файла (N == 1,2, ...). Все операторы работы с файлом, описанные ниже, работают только с открытым файлом и обращаются к нему не по имени, а просто по номеру. Поэтому нельзя одновременно открыть два файла с одним и тем же номером. Закрыв файл, вы можете использовать его номер для открытия другого файла.

Для освоения работы со входным и входным файлом решим следующую задачу:

а) набрать в текстовом файле несколько чисел;

б) ввести их средствами BASIC, просуммировать и найти среднее;

в) вывести в файл TESTO.TXT количество чисел, сумму м среднее.

  1. Запустите любой текстовый редактор и создайте небольшой текстовый файл с произвольным именем, — например, — TESTI.TXT. Запишите в файл 5-7 строк, причем в каждой строке наберите какое-либо вещественное число, например:
  2.  

    25.9{Enter}

    -17.2{Enter}

    8.4 {Enter}

    19.7{Enter}

    36.6 {Enter}

     

  3. Составьте программу на языке BASIC.

 

'Блок 1. Чтение входного файла.

10 OPEN "TESTI.TXT" FOR INPUT AS #1

20 sum = 0 : k = 0 'сумма и количество

30 WHILE NOT EOF(1)

40 INPUT #1, a

50 sum= sum + a : k = k + 1

60 WEND

70 sred =sum/k

80 CLOSE # 1

'Блок 2. Запись выходного файла.

100 OPEN "TESTO.TXT" FOR OUTPUT AS #1

110 PRINT #1,k; sum;sred

120 CLOSE #1

130 PRINT k;sum;sred

140 END

Чтение входного файла организовано циклом WHILE... WEND.

Имя функции EOF(N), где N — номер открытого файла, расшифровывается как End Of File (Конец файла). Эта функция возвращает логическое значение "Истина", если прочитан конец файла, и "Ложь" — в остальных случаях. Выражение NOT EOF(l) истинно, если прочитана обычная запись файла с номером 1.

Оператор INPUT читает одну запись файла — символы до возврата каретки. Прочитанное значение присваивается переменной а.

Оператор CLOSE #N закрывает файл с указанным номером.

Командами 100-120 мы открываем выходной файл TESTO.TXT, выводим в него значения k, sum и sred и закрываем его.

Откройте полученный текстовый файл (команда [File-Open]) и убедитесь, что в единственной строке файла действительно записаны количество чисел, сумма и среднее.

Рекомендуем вам применять для чтения файла не оператор INPUT ("Ввод"), а оператор LINE INPUT ("Ввод строки"). Принципиальная разница между этими операторами заключается в следующем. INPUT, читая запись (строку файла), как бы имитирует ввод данных с дисплея: отбрасывает начальные и хвостовые пробелы в строке, а запятую интерпретирует как разделитель данных. LINE INPUT читает строку целиком, до разделителей 13 и 10.

Пример. Познакомившись со способами обработки текстовых файлов, вы без труда сможете написать короткую "концертную" программу, которая будет исполнять любую мелодию, записанную в текстовом файле. Например, наберите текст мелодии "Элизе" в текстовом файле ELIZA.TXT (опустите PLAY и кавычки):

L8 оЗ е . . . {Enter} Напишите программу:

INPUT "Введите имя файла-мелодии ",fl$

OPEN fl$ FOR INPUT AS #1

WHILE NOT EOF(1)

LINE INPUT #1. ml$

PLAY ml$

WEND

CLOSE #1

END

Доступ к файлам. (Бейсик)

 

Чтобы начать работу с файлом его необходимо открыть командой OPEN. После этого можно проводитm команду чтения оператором INPUT или команду записи в файл оператором PRINT. Работая с файлами необходимо помнить, что программа различает файлы по двум признакам: по типу и по способу доступа.

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

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

В дальнейшем мы будем рассматривать только текстовые файлы последовательного доступа, открываемые как входные, ( для чтения –INPUT) или как выходные (для записи – OUTPUT)

Текстовый файл трактуется как совокупность строк переменной длинны. Доступ к каждой возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой строки ставится специальный признак EOLN, а в конце всего файла EOF.

 

Техника работы с файлом.

 

Для открытия файла используется оператор OPEN:

OPEN имя файла FOR режим AS # N

Имя файла обычная строка символов, режим – команда INPUT или OUTPUT N – порядковый номер открываемого файла. Все операторы рассматриваемые ниже работают только с открытым файлом и обращаются к нему не по имени а по номеру.

Задача набрать в текстовом файле test.txt несколько чисел

Ввести их через БЕЙСИК, просуммировать и найти среднее,

Ввести в файл ASD.txt количество чисел, сумму и среднее.

 

REM чтение входного файла.

OPEN "test.txt" FOR INPUT AS #1

WHILE NOT EOF(1)

INPUT #1, a

sum = sum + a: k = k + 1

WEND

sred = sum / k

CLOSE #1

REM запись выходного файла

OPEN "asd.txt" FOR OUTPUT AS #1

PRINT #1, k; sum; sred

CLOSE #1

PRINT k; sum; sred;

Задача подсчитать количество символов и строк в файле.

CLS

REM чтение входного файла.

OPEN "test.txt" FOR INPUT AS #1 WHILE NOT EOF(1)

INPUT #1, a$

sum = sum + LEN(a$): k = k + 1 WEND

CLOSE #1

REM запись выходного файла

OPEN "asd.txt" FOR OUTPUT AS #1 PRINT #1, k; sum;

CLOSE #1

PRINT k; sum;