Языки Бейсик
.pdfГлава IX. Работа с символьными данными |
71 |
Используйте LSET для присвоения записи переменной одного типа данных другому типу данных, определенному пользователем.
Пример:
a$ = “AAAAAAAA”
PRINT a$; LEN(a$): n$ = “ВесНа”
n$ = LCASE$(n$): RSET a$ = n$: PRINT a$; LEN(a$)
RSET d$ = UCASE$(“осенЬ”): PRINT d$; LEN(d$) b$ = “BBBBBBBB”: PRINT b$; LEN(b$)
LSET b$ = UCASE$(n$): PRINT b$; LEN(b$) Результат:
AAAAAAAA8
весна 8 0
BBBBBBBB8
ВЕСНА 8
72 |
Языки Бейсик |
Глава X. Файлы данных
Общие сведения о файлах.
Информация, которая вводится или выводится из программы, организована в файлы. Файлом называется поименованная совокупность связанных между собой записей. Запись же представляет собой совокупность элементов, рассматриваемых как одно целое с точки зрения устройства ввода-вывода. Именно записями одно устройство компьютера (например — память) обменивается с другим (например — принтер или дисковод). В предельном случае запись может быть и одним символом. Для нас наибольший интерес представляют файлы на магнитных дисках, как наиболее распространенный способ хранения и обработки информации. Файл на магнитном диске обязательно имеет имя, которое хранится в оглавлении диска или каталога (в Window's-папке). Вместе с именем файла там же хранится информация о длине файла, дате его создания, дате обновления.
Типы файлов.
Наиболее грубое деление файлов на группы — это программные файлы и файлы данных. Программные файлы содержат тексты программ; файлы данных — это символьная информация, которая обрабатывается с помощью программ. Хотя конечно же это тоже весьма условное деление, хотя бы потому, что программы для трансляторов являются файлами данных. Поэтому правильнее называть программными файлами такие файлы, которые являются программами, то есть являются набором команд для какого-либо процессора. Поскольку целью данной книги не является научить читателя пользоваться каким-либо конкретным транслятором языка Бейсик, постольку мы будем рассматривать только файлы данных.
Файлы данных подразделяются на три типа: последовательные, произвольного доступа и двоичные.
—В последовательном файле записи размещаются последовательно друг за другом. Чтобы получить (считать с диска) какую-то запись файла, необходимо прочитать все предыдущие записи этого файла.
—В файлах произвольного доступа существует возможность доступа к произвольной записи, не затрагивая предыдущие и последующие записи данного файла, что значительно экономит время доступа к записи и возможность ее обновления (корректировки). Файлы произвольного доступа — это обычно файлы баз данных со структурированной информацией.
—В двоичном файле информация записана как набор байтов. Обычно это исполняемые файлы.
В данной книге мы ограничимся рассмотрением операторов Бейсика для работы с двумя первыми типами файлов.
Глава X. Файлы данных |
73 |
10.1.Средства обработки файлов
Таблица 10.1.
Операторы работы с файлами.
Последовательные фай- |
Произвольные |
ôàé- |
Что делает |
ëû |
ëû |
|
|
OPEN |
OPEN |
|
Открыть файл |
|
|
|
|
CLOSE |
CLOSE |
|
Закрыть файл |
|
|
|
|
INPUT# |
|
|
Прочитать запись |
|
|
|
|
LINE INPUT# |
|
|
Прочитать строку |
|
|
|
|
INPUT$ |
|
|
Возвратить строку символов |
|
|
|
|
PRINT# |
|
|
Записать запись |
|
|
|
|
PRINT# USING |
|
|
Записать запись |
|
|
|
|
WRITE# |
|
|
Записать запись |
|
|
|
|
|
FIELD |
|
Определить буфер обмена |
|
|
|
|
|
GET |
|
Прочитать запись |
|
|
|
|
|
LSET |
|
Поместить слева |
|
|
|
|
|
RSET |
|
Поместить справа |
|
|
|
|
|
PUT |
|
Записать запись |
|
|
|
|
|
CVS,CVI,CVD |
|
Преобразовать данные |
|
|
|
|
|
MKS$, MKI$ |
|
Преобразовать данные |
|
|
|
|
|
MKD$ |
|
Преобразовать данные |
|
|
|
|
LOC |
LOC |
|
Определить позицию |
|
|
|
|
LOF |
LOF |
|
Вернуть длину файла |
|
|
|
|
EOF |
|
|
Конец файла |
|
|
|
|
FILEATTR |
|
|
Возвращает информацию |
|
|
об открытом файле |
|
|
|
|
|
FREEFILE |
|
|
Возвращает номер след. не- |
|
|
используемого файла. |
|
|
|
|
|
LOCK |
|
|
Закрывает доступ к файлу |
|
|
при работе в сети. |
|
|
|
|
|
|
|
|
|
|
|
|
Отменяет ограничения, на- |
UNLOCK |
|
|
ложенные последним опера- |
|
|
|
тором LOCK. |
|
|
|
|
Одним из важнейших атрибутов файла является его имя. Имя файла состоит из имени дисковода, каталога (папки), идентификатора файла, то есть всего того, что позволяет найти файл на диске. Причем имя файла в DOS имеет следующие ограничения (в WINDOWS этих ограничений нет):
— используются только английские буквы;
74 |
Языки Бейсик |
— не допускаются спецсимволы и пробелы.
Идентификатор файла — это непосредственно обозначение файла (в DOS не больше восьми символов) и его расширение, которое добавляется через точку и содержит не более трех символов.
Работа с файлами делится на три вида:
—создание (запись файла на диск);
—чтение файла и обработка записей файла;
—добавление записей (расширение файла).
Для добавления (изменения) существующих записей в файлах с последовательным доступом требуется фактически переписать все записи файла заново, в том числе и те, которые не требовали изменения.
Файлы данных с произвольным доступом позволяют считывать данные в любом порядке, независимо от того, в какой последовательности они были записаны в файл. Запись и чтение файла выполняются в виде отдельных записей так же, как и в случае работы с последовательным файлом, но каждая запись имеет свой номер. Наличие номера позволяет обращаться непосредственно к необходимой записи файла. Максимальная длина записи 32 767 байт.
10.2. Оператор OPEN
Оператор OPEN (открыть) выполняет определенную подготовительную работу для последующих операций ввода-вывода. Он заполняет блок управления данными, в который система помещает номер файла и номер устройства, с которым будет работать система; резервирует области оперативной памяти для буферов обмена операций ввода-вывода; определяет организацию данных в файле и режим его обработки и пр.
Формат записи оператора OPEN:
OPEN файл$ [FOR режим] [ACCESS доступ] [закр] AS [#]номер_файла% [LEN=д_зап%]
ãäå |
|
ôàéë$ |
Имя файла или устройства. Имя файла может включать |
|
устройство и путь. |
режим |
Один из следующих режимов файла: APPEND, BINARY, IN- |
|
PUT, OUTPUT или RANDOM. Ключевые слова APPEND, |
|
BINARY, INPUT, OUTPUT и RANDOM используются в |
|
операторе OPEN для указания режимов. Кроме того, INPUT, |
|
OUTPUT и RANDOM используются в операторе OPEN |
|
COM. |
APPEND |
Указывает, что файл должен быть открыт для последователь- |
|
ного вывода, и устанавливает указатель файла в конец файла. |
|
В этом случае операторы PRINT# или WRITE# дополняют |
|
ôàéë. |
BINARY |
Указывает бинарный режим файла. В бинарном режиме вы |
|
можете считывать или записывать информацию в позицию |
|
любого байта, используя операторы GET и PUT. |
INPUT |
Указывает, что файл открыт для последовательного ввода. |
Глава X. Файлы данных |
75 |
|
OUTPUT |
Указывает, что файл открыт для последовательного вывода. |
|
RANDOM |
Указывает, что файл открыт в режиме прямого доступа к |
|
|
файлу. Этот режим устанавливается по умолчанию. |
|
Доступ |
При работе в сети указывает, открыт ли файл для READ (чте- |
|
|
ния), WRITE (записи) или READ WRITE (чтения-записи). |
|
Çàêð |
Указывает, как файл закрыт для сетевого доступа: |
|
SHARED (Общий), LOCK READ (закрыт для чтения), LOCK WRITE (закрыт для записи), LOCK READ WRITE (закрыт для чтения-запи- си)
Номер_файла% Номер в пределах от 1 до 255, идентифицирующий открытый
|
файл в программе. |
Ä_çàï% äëÿ |
Длина записи (по умолчанию 128 байт). Для последовательных |
файлов прямого файлов — число буферированных символов (по умолчанию 512
доступа |
байт). Длина записи может находиться в пределах от 1 до 32 767 |
|
|
áàéò |
|
ACCESS |
Указывает тип доступа, который получает пользователь к от- |
|
|
крытому файлу. |
|
|
ACCESS {READ | WRITE | READ WRITE} |
|
|
READ |
Открывает файл только для чтения. |
|
WRITE |
Открывает файл только для записи. |
|
READ WRITE Открывает файл как для чтения, так и для запи- |
|
|
|
ñè. |
Режим READ WRITE действителен только для бинарных и файлов прямого доступа, а также для файлов, открытых с операндом APPEND (последовательный доступ).
Пример 10.2.1.:-создание последовательного файла
INPUT “Введите имя файла: “; n$
OPEN n$ FOR OUTPUT AS #1
PRINT #1, “Это хранится в файле”
CLOSE
OPEN n$ FOR INPUT AS #1
INPUT #1, a$
PRINT “Чтение из файла: “; a$
CLOSE
Файл, который открывается для последовательного чтения, то есть с операндом INPUT, должен существовать на диске к моменту выполнения оператора OPEN, иначе выдается сообщение об ошибке.
Если файл открывается для последовательной записи данных из оперативной памяти, то есть с операндом OUTPUT, то при выполнении оператора OPEN система каждый раз создает новый файл, а старый уничтожает. Если файл данных с операндом OUTPUT уже открыт в программе, его нельзя повторно открыть в
76 |
Языки Бейсик |
этой же программе, если не было закрытия файла(оператор CLOSE), иначе система выдает сообщение об ошибке.
При открытии несуществующего файла для его дополнения, т.е. с операндом APPEND, система создает новый файл с указанным именем. Новые данные в такой файл записываются в конец файла. При работе с последовательным файлом в режиме добавления (APPEND) в нем сохраняются все ранее введенные данные.
Пример 10.2.2.:-создание файла с произвольным доступом
TYPE TestRecord 'определяем тип пользователя Student AS STRING * 20
Score AS SINGLE END TYPE
DIM MyClass AS TestRecord
'открываем файл прямого доступа
OPEN “FINAL.DAT” FOR RANDOM AS #1 LEN = LEN(MyClass)
MyClass.Student = “Олег Дворченко” MyClass.Score = 99
PUT #1, 1, MyClass 'создаем первую запись
CLOSE #1
OPEN “FINAL.DAT” FOR RANDOM AS #1 LEN = LEN(MyClass) GET #1, 1, MyClass
PRINT “СТУДЕНТ:”, MyClass.Student PRINT “СЧЕТ:”, MyClass.Score CLOSE #1
KILL “FINAL.DAT”
Если файл ранее не существовал, то оператор OPEN его создаст. Одному и тому же файлу прямого доступа можно присвоить внутри программы несколько номеров. Для каждого номера файла надо отводить отдельный буфер в оперативной памяти с помощью оператора FIELD. В этом случае стоит быть особенно внимательным к использованию номеров файлов, чтобы их не перепутать. Повторное открытие одного и того же файла приводит к появлению ошибки: ФАЙЛ УЖЕ ОТКРЫТ.
10.3. Оператор CLOSE
Оператор CLOSE (закрыть) предназначен для закрытия файлов. Особенно важна операция закрытия для выходных(OUTPUT) и обновляемых(APPEND) файлов, потому что только операция закрытия обновляет таблицу файлов на диске. После закрытия файла его номер может быть использован в этой же программе для работы с другим файлом.
Формат записи оператора CLOSE:
CLOSE [[#]номер_файла%[,[#]номер_файла%]...]
ãäå
номер_файла% Номер открытого файла или устройства.
CLOSE без аргументов закрывает все открытые файлы и устройства.
Глава X. Файлы данных |
77 |
Пример 10.3.1.:
CLS
INPUT “Введите имя файла: “, n$
OPEN n$ FOR OUTPUT AS #1
PRINT #1, “Это хранится в файле”
CLOSE
OPEN n$ FOR INPUT AS #1
INPUT #1, a$
PRINT “Чтение из файла: “; a$
CLOSE
Файлы закрывает не только оператор CLOSE. Операторы END, RESET, SYSTEM, RUN автоматически закрывают все открытые файлы.
10.4. Оператор WRITE#
Оператор WRITE(писать) записывает данные на экран или в последовательный файл.
Формат оператора WRITE:
WRITE [[#]номер_файла%,] выражение
ãäå
Номер_файла% Номер открытого последовательного файла. Если номер файла опущен, WRITE выводит данные на экран.
Выражение Одна или несколько переменных или выражений, разделенных запятыми, значения которых записываются на экран или в файл.
WRITE вставляет запятые между объектами и заключает в кавычки строки в той последовательности, в которой они написаны, т.е. каждый элемент записи записывается на диск в виде символьной константы, все элементы одной записи отделяются друг от друга запятыми, а сама запись заканчивается символами “Возврат каретки” и “Перевод строки”. WRITE записывает значения в файл в той форме, которая может быть считана оператором INPUT. Перед положительным числом и после него пробелы не вставляются.
Пример 10.4.1:
CLS
OPEN “LIST” FOR OUTPUT AS #1 DO
INPUT “ ИМЯ : “, Name$ INPUT “ ВОЗРАСТ: “, Age$ WRITE #1, Name$, Age$ INPUT “Добавить еще”; R$
LOOP WHILE UCASE$(R$) = “Ä”
CLOSE #1
'Печать файла на экране. OPEN “LIST” FOR INPUT AS #1 CLS
78 |
Языки Бейсик |
PRINT “Записи в файле:”: PRINT |
|
DO WHILE NOT EOF(1) |
|
INPUT #1, Rec1$, Rec2$ 'Считывает записи из файла |
|
PRINT Rec1$, Rec2$ 'Печатает записи на экране |
|
LOOP |
|
CLOSE #1 |
|
KILL “LIST” |
|
10.5. Оператор INPUT#
INPUT(ввод) считывает входные данные с клавиатуры или из файла. LINE INPUT (ввод строки) считывает строку, содержащую до 255 символов, с клавиатуры или из файла.
Формат оператора INPUT:
INPUT [;] [“приглашение”{; | ,}] список переменных INPUT #номер файла%, список переменных
LINE INPUT [;] [“приглашение”;] переменная$ LINE INPUT #номер файла%, переменная$
ãäå |
|
приглашение |
необязательная строка, отображаемая на экране перед |
|
вводом данных. Точка с запятой, стоящая сразу после при- |
|
глашения, добавляет знак вопроса в строку приглашения, |
|
которая выводится на экран монитора. |
список переменных одна или несколько переменных, разделенных запя-
|
тыми, которые служат для хранения данных, вводимых с |
|
клавиатуры или считанные из файла. Имя переменной |
|
может состоять из 40 символов и должно начинаться с |
|
буквы латинского алфавита. Допустимыми являются |
|
символы A-Z, 0-9 и точка (.). |
переменная$ |
хранит строку символов, введенных с клавиатуры или счи- |
|
танных из файла. |
номер файла% |
номер файла, открытого оператором OPEN. |
INPUT использует запятую для разделения записей.
LINE INPUT считывает все символы до символа возврата каретки.
При вводе с клавиатуры точка с запятой, стоящая сразу после оператора INPUT, оставляет курсор в той же строке при нажатии пользователем клавиши Enter.
Пример 10.5.1:
CLS
OPEN “LIST” FOR OUTPUT AS #1 DO
INPUT “ ИМЯ: “, name$ 'Считывает символы с клавиатуры. INPUT “ ВОЗРАСТ: “, age$
WRITE #1, name$, age$ INPUT “Продолжить”; R$
Глава X. Файлы данных |
79 |
LOOP WHILE UCASE$(R$) = “Ä” CLOSE #1
'Просмотр файла.
OPEN “LIST” FOR INPUT AS #1
CLS
PRINT “Записи в файле:”: PRINT DO WHILE NOT EOF(1)
LINE INPUT #1, REC$ 'Считывает записи из файла. PRINT REC$ 'Печатает записи на экране.
LOOP
CLOSE #1
KILL “LIST” 'Уничтожает созданный файл
10.6. Оператор PRINT# USING
Оператор PRINT# USING (напечатать по шаблону) записывает отформатированную запись на экран или в файл.
LPRINT USING печатает отформатированную запись на принтер LPT1.
Формат операторов:
PRINT [#номер_файла%,] USING символы_шаблона$; выражения [{; | ,}]
LPRINT USING символы_шаблона$; выражения [{; | ,}]
ãäå
номер_файла% — номер файла, открытого оператором OPEN. символы_шаблона$ — символьное выражение, содержащее один и более
|
определителей формата. |
выражения |
— одно или несколько числовых или символьных выраже- |
|
ний, разделенных запятыми, точкой с запятой, пробе- |
|
лами или знаками табуляции. |
{; | ,} |
— символы, которые определяют, где начинается следую- |
|
щий вывод: |
|
; — печать сразу после последнего символа. |
|
, — печать в начале следующей зоны печати. |
|
(Ширина зоны печати — 14 символов). |
Шаблон обеспечивает вывод данных в нестандартном формате. Шаблон представляет собой символьную константу или переменную и определяет вид, в котором все данные выводятся на экран монитора или записываются в файл.
10.6.1. Шаблоны для символьных данных
Шаблон |
Результат |
|
|
“!” |
Вывод только первого символа |
|
|
“\n пробелов\” |
Вывод 2+n первых символов |
|
|
“&” |
Вывод всех элементов |
|
|
|
|
80 |
Языки Бейсик |
Шаблон действует на весь список выражений, указанный в операторе PRINT USING. Если в списке указываются несколько символьных выражений, то они выводятся на экран друг за другом без пробелов. Пробелы, если они необходимы, в этом случае необходимо предусмотреть в шаблоне, как показано в примере 10.6.1.
Пример 10.6.1:
PRINT USING “\ \ “;”ABCDEZ”,”UGHKMN”
После выполнения на экране будет отпечатано
ABCDE UGHKM
10.6.2. Вывод числовой информации
Эта операция выполняется по одному из трех шаблонов в зависимости от вида числа (целое, с фиксированной точкой, с плавающей точкой).
10.6.2.1.Шаблоны для вывода целых чисел имеют вид:
[+]{#... #}[+,-] [+]{**#... #}[+,-] [+]{$$#... #}[+,-] [+]{**$#... #}[+,-]
ãäå
знак # знак резервирования места для цифр выводимого числа, знака минус или пробела;
символы ** показывают, что все незначащие нули слева замещаются звездоч- ками;
символы $$ показывают, что все незначащие нули слева замещаются пробелами, а перед первой значащей цифрой ставится знак $;
символы **$ показывают, что все незначащие нули слева замещаются звездоч- ками, а перед первой значащей цифрой ставится знак $;
—знак +(плюс) в начале или в конце шаблона замещается знаком плюс для положительного числа и знаком минус для отрицательного числа.
—знак - (минус) указывается только в конце шаблона и замещается знаком минус для отрицательного числа, или пробелом для положительного числа.
Количество символов в шаблоне должно быть не более 23 без учета знаков, иначе выдается сообщение об ошибке.
Если количество символов в шаблоне меньше, чем это требуется для вывода числа, то перед ним система выводит знак %.
В шаблоне можно указать любые символы, которые выводятся без изменений.
Пример 10.6.2:
PRINT USING “+##”; 23; — 26 +23-26 результат
