Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatics.doc
Скачиваний:
6
Добавлен:
21.08.2019
Размер:
1.33 Mб
Скачать

1.11. Файлы

Файл - это последовательность записей на внешнем носителе ин-формации. Обычно каждая информационная система организует фай-лы своим специальным образом, присоединяя к имени файла отличи-тельную "типовую" добавку - расширение. Например, файлы в DOS часто имеют расширение .com, .sys, .exe и др., файлы в WORD имеют расширение .doc, . rtf, htm и др., в EXCEL - расширение .xls, в PAINT -.bmp, в MULTIMEDIA .avi, .wav, и т.д. В Бейсике, в основном, созда-ются текстовые и двоичные файлы - без расширения (или с расшире-нием, определяемым пользователем), либо файлы программ с расши-рением .bas .

По типу доступа в Бейсике организуются файлы последователь-ные и файлы прямого доступа.

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

Открытие файла осуществляется строкой

OPEN" устройство : \ имя" FOR ‹ действие › AS # N,

где действие = , т.е. ввод (считывание из файла), вывод (запись в файл), добавление (к записям в файле), N -номер, присвоен-

ный файлу в программе.

Работа с файлами:

INPUT # N,‹ имя переменной › - считывание записи из файла N,

PRINT # N,‹ имя переменной › - запись в файл с номером N.

Иногда употребляются также операторы WRITE #N (записи разделя-ются запятыми, текстовая информация оформляется в кавычки (это удобно, когда текст содержит знаки препинания) и LINEINPUT # N для чтения информации, записанной оператором WRITE.

Функции LOC и LOF возвращают номер записи и длину файла в байтах. Логическая функция EOF(N) возвращает значение TRUE, если обработана последняя запись файла с номером N, иначе - значение FALSE.

Закрытие файла:

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

Полезно в конце работы закрывать все файлы, чтобы не оставлять ин-формацию в буфере обмена. Оператор END заканчивает программу, закрывая все открытые файлы. Оператор KILL # N уничтожает файл с номером N (освобождает его место в памяти, убирает его имя из ката-лога).

Пример 1. В последовательном файле My_inf требуется оста-вить только числа z, удовлетворяющие условию: z  (0, ), < 2. Откроем временный файл с именем Tempo одновременно для записи

и чтения, затем его уничтожим:

DEFSNG Z : CONST pi = 3.1415926

OPEN "C: \ TEMP \ My_inf" FOR INPUT AS #1

OPEN "C: \ TEMP \ Tempo" FOR OUTPUT AS #2

OPEN "C: \ TEMP \ Tempo" FOR INPUT AS #3

DO: INPUT #1, z

IF (z > 0) AND (z < pi) AND ((EXP( - z) + 1) / SIN(z) < 2) THEN PRINT #2,z

LOOP UNTIL EOF(1)

CLOSE #1: OPEN "C: \ TEMP \ My_inf" FOR OUTPUT AS #1

DO: INPUT #3, z: PRINT #1, z : LOOP UNTIL EOF(3)

CLOSE : KILL #2, #3

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

Открытие файла:

OPEN" устройство : \ имя" FOR RANDOM AS # N LEN = M, где N - номер, присвоенный файлу в программе, М - длина записи в

байтах.

Определение поля в буфере обмена (следует после открытия файла):

FIELD # N,‹ поле 1› AS ‹ имя 1›, ‹ поле 2› AS ‹ имя 2›, и т.д.,

где N -номер файла, ‹ поле i › - размер памяти в байтах, отводимой бу-ферной переменной ‹ имя i ›, i = 1,2,..., сумма полей равна М.

Работа:

GET # N, m -считывание записи с номером m из файла с номе-

ром N в буфер.

PUT # N, m - запись содержимого буфера обмена в файл (m -я

запись) с номером N.

Так как здесь обменивается информация только в символьном виде, то числовую информацию следует предварительно переводить в сим-вольную, а при считывании снова переводить в числовую форму. Для этой цели используются, кроме указанных ранее, функции MKI$, CVI (для целых чисел), MKS$, CVS (действительные числа обычной дли-ны), MKD$, CVD (действительные числа двойной длины):

число строка .

Засылка текстовой информации V$ в буферное поле U$ осуществля-ется операторами LSET U$ = V$ и RSET U$ = V$ с выравниванием

по левому и правому краю.

Закрытие - так же, как и для последовательного файла.

Пример 2. Пусть файл "List", расположенный на диске А, содер-жит записи вида: ‹ фамилия, количество детей, домашний адрес, теле-

фон ›, под фамилию отведено 20 байт, под детей 2 байта, под адрес 30

байт, под телефон 8 байт буферной памяти. Требуется вывести на эк-ран фамилии, начинающиеся на букву С, семьи которых имеют не ме-

нее двух детей. Это можно сделать программой:

DEFINT I-N :

OPEN "A:\LIST" FOR RANDOM AS #1 LEN = 60

FIELD #1, 20 AS NAME$, 2 AS CHILD$, 30 AS ADDRESS$ , 8 AS TELEPHONE$

DO : i = i + 1: GET #1 ,i

T$ = LEFT(NAME$ ,1) : n = CVI(CHILD$)

IF (T$ = "C") AND (n =>2) THEN

PRINT NAME$; CHILD$; ADDRESS$; TELEPHONE$

END IF

LOOP UNTIL EOF(1) : CLOSE #1

В приведенном примере можно обойтись без формирования поля

буфера, введя пользовательский тип (см. п. 5):

TYPE Friends

Fam AS STRING * 20

Chil AS INTEGER

Addr AS STRING * 30

Tel AS LONG

END TYPE

DIM Inf AS Friends

OPEN "A:\LIST" FOR RANDOM AS #1 LEN = LEN(Inf)

DO: i = i + 1: GET #1, i, Inf

IF (LEFT$(Inf. Fam, 1) = "C") AND (Inf. Chil >= 2) THEN

PRINT Inf. Fam; Inf. Chil; Inf. Addr; Inf. Tel

END IF

LOOP UNTIL EOF(1): CLOSE #1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]