Скачиваний:
109
Добавлен:
21.01.2014
Размер:
2.38 Mб
Скачать

4. Контрольные вопросы

                  1. Назначение и синтакис операторов CALL INTERRUPT, CALL INTERRUPTХ, CALL INT86OLD, CALL INT86XOLD ?

Вопросы по процедуре выполнения индивидуального задания.

5. Библиографический список

                  1. Бобровский С. Программирование на языке QBASIC для школьников и студентов. — М.: Десс; Инфорком-Пресс, 1999. - 208 с.

                  1. Зельднер Г.А. Программируем на языке QuickBASIC 4.5. - М: ABF, 1996. - 432 с.

                  1. Введение в программирование на языке Microsoft BASIC: Учебное пособие / Ю.Я. Максимов, С.В. Осипов, А.В. Потемкин, Щ.С. Симоненков. - М.: ”Диалог-МИФИ”,1991. - 176 с.

Министерство образования

Российской Федерации

Тульский государственный университет

Кафедра “Инструментальные и метрологические системы”

Информатика

ЛАБОРАТОРНАЯ РАБОТА 19

Работа с файлами в среде QB

для студентов очного обучения

Тула 2000 г.

1. Цель и содержание работы

Целью работы является изучение способов долговременного хранения данных.

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

2. Порядок выполнения работы

                  1. Изучить теоретическую часть.

                  1. Получить задание у преподавателя.

                  1. Выполнить задание.

                  1. Оформить отчет.

                  1. Защитить работу.

3. Теоретическая часть

Операторы языка

OPEN

Оператор

Включает ввод/вывод файл или устройство

OPEN файл$ [FOR режим1] [ACCESS доступ] [блок] AS [#]номер[LEN=длина]

OPEN режим2, [#]номер, файл$ [LEN=длина] ‘Альтернативный синтакис

  • файл$- символьное выражение, определяющее имя файла или устройства включая путь;

  • режим - одно из описанных ниже ключевых слов;

  • доступ - при работе в сети указывает, открыт ли файл для чтения, записи или чтения и записи;

  • блок - указывает, как файл закрыт для сетевого доступа: общий, закрыт для чтения, закрыт для записи, закрыт для чтения и записи;

  • номер - номер файла - целое выражение от 1 до 255;

  • длина - длина записи. По умолчанию 128 байт- для файлов прямого доступа и 512 - последовательного доступа.

  1. Режим1 (2)

Описание

Тип доступа

Описание

OUTPUT (O)

Определяет последовательный вывод;

READ

Только для чтения;

INPUT (I)

Определяет последовательный ввод;

WRITE

Только для записи;

APPEND (A)

Определяет последовательный вывод с добавлением, т.е. устанавливает указатель записи к концу файла. Операторы PRINT# и WRITE# добавляют выводимые данные к концу файла;

READ WRITE

Чтение и запись. Этот тип доступа возможен только для файлов RANDOM, APPEND, BINARY.

RANDOM (R)

Определяет прямой ввод и вывод ( умалчиваемый тип) . Если нет условия ACCESS, доступ выполняется в порядке: 1- чтение и запись, 2- только запись, 3- только чтение;

Тип блока

по умолчанию

Описание

По умолчанию файл может быть открыт любое число раз для чтения и записи но другие процессы не имеют доступа к этому файлу пока файл открыт;

BINARY (B)

Определяет двоичный ввод и вывод. Можно читать или писать информацию любого байта файла операторами GET и PUT.

SHARED

Любые процессы на любой машине могут иметь доступ для чтения и записи файла;

  • Перед любыми операциями ввода и/или вывода файл необходимо открыть.

  • Если режим не указан - по умолчанию RANDOM.

  • Условие ACCESS работает с DOS поддерживающим сети.

LOCK READ

Другие процессы не имеют возможности чтения этого файла. Эта блокировка возможна если другие процессы ранее не блокировали доступ для чтения к этому файлу;

  • Условие “блок” работает в многозадачной среде для разделения доступа между процессами к открытому файлу.

  • Длина записи не может превышать 32767 байт и игнорируется для двоичного файла. Для файлов последовательного типа она означает размер буфера (по умолчанию 512 байт)

LOCK WRITE

Другие процессы не имеют возможности писать в этот файл. Эта блокировка возможна если другие процессы ранее не блокировали доступ для записи к этому файлу;

  • QuickBASIC поддерживает как файлы следующие устройства:

  • KYBD: - клавиатура; СONS: - консоль;

  • SCRN:- экран; СОМn:- СОМ порт № n;

  • LTPn: - LTP порт № n.

  • Система ввода/вывода позволяет иметь пользовательские устройства - символьные с длиной записи = 1 (символы не буферизуются.

LOCK READ WRITE

Другие процессы не имеют возможности читать и писать в этот файл. Эта блокировка возможна если другие процессы ранее не блокировали доступ для записи и /.или для чтения к этому файлу.

  • Ни одно из устройств прямо не поддерживает двоичный тип кроме принтеров LPT1 LPT2 . для этого служит ключевое слово BIN.

  1. INPUT "Введите имя файла: "; n$

OPEN n$ FOR OUTPUT AS #1

PRINT #1, "Это находится в файле"

CLOSE

OPEN n$ FOR INPUT AS #1

INPUT #1, a$

PRINT "Чтение из файла: "; a$

CLOSE

CLOSE

RESET

Оператор

CLOSE - закрывает один или несколько файлов или устройств.

RESET - закрывает все файлы.

CLOSE [[#] номер_файла [, [#] номер_файла ] ...]

RESET

  • номер_файла - логический номер открытого файла.

  • Если все аргументы опущены, закрываются все файлы и устройства.

  • CLOSE очищает весь буфер для закрываемого файла или устройства. Операторы CLEAR, END, RESET, RUN, и SYSTEM закрывают все файлы автоматически.

  • RESET закрывает все открытые файлы и записывает данные из буферов на диск. Все файлы, находящиеся на дискете должны быть закрыты перед удалением диска из дисковода.

GET

PUT

Операторы

GET считывает из файла в буфер прямого доступа или в переменную

PUT записывает содержимое переменной или буфера прямого доступа в файл

GET [#] номер_файла [ , [ номер_записи ] [ , переменная ]

PUT [#] номер_файла [ , [ номер_записи ] [ , переменная ]

  • номер_файла - номер открытого оператором OPEN файла;

  • номер_записи - номер чтения / записи. Для двоичных файлов- позиция байта, где начинается чтение или запись. При отсутствии номера используется следующая запись. Наибольший возможный размер записи 2147483647;

  • переменная - для GET - переменная, используемая для приема ввода из файла. Для PUT - переменная, содержащая вывод для записи в файл. Переменной обычно является переменная определенного пользователем типа данных. При использовании переменной необходимости в операторах преобразования CVD, CVL, CVI, CVS, MKI$, MKL$, MKS$ и MKD$ нет.

  • Длина записи - не более 32767 байт.

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

  • Можно использовать функцию EOF после оператора GET для проверки условия конца файла.

  • При использовании GET с оператором FIELD из буфера можно читать символы операторами INPUT# или LINE INPUT# после GET.

  • При использовании PUT с оператором FIELD в буфер можно писать символы операторами LSET, RSET, PRINT#, PRINT# USING и WRITE# перед PUT.

  1. 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"

INPUT #

LINE INPUT #

Операторы

INPUT считывает входные данные от клавиатуры или из файла.

LINE INPUT считывает строку, содержащую до 255 символов, от клавиатуры или из файла.

INPUT #номер_файла%, список_переменных

LINE INPUT #номер_файла%, переменная$

  • список_переменных - одна или несколько переменных, разделенных запятыми, в которых хранятся данные, считанные из файла. Переменная может состоять из 40 символов и должна начинаться с буквы. Допустимыми являются символы A-Z, 0-9 и точка (.);

  • переменная$ - хранит строку символов считанных из файла (до знаков ASCII 13 и 10);

  • номер_файла% - номер открытого файла.

  • LINE INPUT считывает все символы до символа возврата каретки.

  1. CLS

OPEN "СПИСОК" FOR OUTPUT AS #1

DO

INPUT " Ф.И.О.: ", name$ 'Считывает ввод от клавиатуры.

INPUT " Группа: ", Group $

WRITE #1, name$, Group$

INPUT "Продолжить"; R$

LOOP WHILE UCASE$(R$) = "Д"

CLOSE #1

'Просмотр файла.

OPEN "СПИСОК" FOR INPUT AS #1

CLS

PRINT "Записи в файле:": PRINT

DO WHILE NOT EOF(1)

LINE INPUT #1, REC$ 'Считывает записи из файла.

PRINT REC$ 'Печатает записи на экране.

LOOP

CLOSE #1

KILL "СПИСОК"

INPUT$ Функция

Возвращает строку символов, считанных из указанного файла

INPUT$(n [, [#] номер_файла%])

  • n - число символов (байтов) для чтения;

  • номер_файла% - номер открытого файла. Если номер_файла% опущен, INPUT$ считывает с клавиатуры.

  • Если файл открыт для прямого доступа, то аргумент n должен быть меньше или равен длине записи, установленной ключевым словом LEN оператора OPEN (по умолчанию 128). Если файл открыт для двоичного или последовательного доступа, n должен быть меньше или равен 32767.

  • Если номер_файла% не указан, то символы читаются со стандартного устройства ввода (если ввод не переназначен - клавиатуры).

  • Для EXE - файлов в среде DOS можно переназначить ввод путем указания в командной строке символов <, >, >>, или , которые используются для предопределения стандартного ввода и вывода.

  1. OPEN "TEST.DAT" FOR OUTPUT AS #1

PRINT #1, "Текст"

CLOSE

OPEN "TEST.DAT" FOR INPUT AS #1

PRINT INPUT$(3, 1) 'Печатает первые три символа

CLOSE

PRINT #

PRINT # USING

WRITE #

Операторы

PRINT #, PRINT # USING, WRITE # записывают данные в последовательный файл.

PRINT # номер_файла%, [ USING формат;] список_выражений [ , | ; ]

WRITE # номер_файла%, [список_выражений]

  • номер_файла% - номер открытого последовательного файла;

  • список_выражений - одно или несколько числовых или символьных выражений записываемых в файл. По умолчанию - пустая строка.

  • PRINT #, работает также как, PRINT, и записывает данные в файл. Пробелы между элементами списка записываются в файл.

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

  1. CLS

OPEN "LIST" FOR OUTPUT AS #1

DO

INPUT " Ф.И.О : ", Name$

INPUT " Группа : ", Group%

WRITE #1, Name$

PRINT #1, USING "######"; Group%

INPUT "Добавить еще"; R$

LOOP WHILE UCASE$(R$) = "Д"

CLOSE #1

BSAVE

BLOAD

Операторы

BSAVE копирует содержимое области памяти в файл.

BLOAD загружает файл, созданный BSAVE, в память.

BSAVE файл$, смещение%, длина&

BLOAD файл$, [ смещение% ]

  • файл$ - для BSAVE - файл в который побайтно будет скопирована область памяти. Для BLOAD - файл образа памяти, созданный предыдущим BSAVE;

  • смещение% - для BSAVE - смещение начального адреса области памяти, которую необходимо сохранить. Для BLOAD - смещение начального адреса области памяти, в которую будут загружены данные;

  • длина& - число байтов для копирования (от 0 до 65535).

  • Стартовый адрес области памяти для сохранения или загрузки определяется смещением начального адреса (offset) и последним оператором DEF SEG. Если смещение не указано, используется смещение, записанное в файле. Если сегмент не определен оператором, используется по умолчанию сегмент данных QuickBASIC.

  • При использовании BSAVE нельзя применять устройства (SCRN: и CONS:). При использовании BLOAD нельзя применять устройство KYBD: - клавиатура.

  1. DIM Ris (1 TO 520)

SCREEN 1

... ‘Рисуем операторами LINE и DRAW

GET(130, 20) - (230 - 100), Ris ‘Запись графики в файл

DEF SEG = VARSEG (Ris(1))

BSAVE “POSTER.GRH”, VARPTR (Ris(1)), 2080 ‘ по 4 байта на элемент

DEF SEG

...

DEF SEG = VARSEG (Ris(1)) ‘Считывание графики из файла

BLOAD “POSTER.GRH”, VARPTR (Ris(1))

DEF SEG

PUT (70, 20), Ris

EOF

LOF

Функции

Проверка конца файла. EOF возвращает "истинно" (не ноль) при достижении конца файла.

LOF возвращает длину файла в байтах.

EOF(номер_файла%)

LOF(номер_файла%)

  • номер_файла% - номер открытого файла.

  • Функция EOF возвращает - 1 (“истина”), если указатель в файле последовательного доступа дошел до его конца. Для файлов прямого и двоичного доступа “истина” возвращается при попытке оператора GET считать запись после конца файла.

  • LOF при открытии файла любого доступа выдает его размер в байтах.

  • Функции не используются с устройствами SCRN:, KYBD:, CONS:, LPTn.

  1. DIM Group(0 TO 1000)

OPEN "KAF.IMS"FOR INPUT AS #1

c = 0

DO WHILE NOT EOF(1) AND c< 1000

INPUT #1, Group (c)

c = c + 1

LOOP

INPUT "Введите имя файла: "; f$

OPEN f$ FOR BINARY AS #1

FilS& = LOF (1) \ 1024

CLOSE #1

PRINT "Длина файла = "; FilS&;“Kb”

FIELD

Оператор

Отводит место под переменные в буфере файлов прямого доступа.

FIELD [#] номер_файла% , длина AS переменная [ , длина AS переменная] ...

  • номер_файла% - номер открытого файла;

  • длина - число символов в поле данных;

  • переменная - переменная, идентифицирующая поле и содержащая данные поля.

  • Запись переменных обычно обеспечивает лучший способ для управления записью данных.

  • Общее число байт - длин полей, не должно превышать длины записи, определенной при открытии файла. По умолчанию длина записи равна 128 байт.

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

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

  • Поскольку операторы PRINT или операторы присваивания занимают определенное место в памяти то переменные поля использовать нежелательно.

  1. OPEN "GROUP.IMS" FOR RANDOM AS #1 LEN = 80

FIELD #1, 30 AS NameC$, 50 AS Address$

LSET

RSET

Операторы

LSET и RSET перемещают данные из памяти в буфер файлов прямого доступа (для оператора PUT) и осуществляют правое или левое выравнивание значений строковой переменной. LSET также копирует содержимое одной записи переменной в другую без сравнения типов данных.

LSET | RSET переменная = выражение | переменная_1 = переменная_2

  • переменная - любая символьная переменная;

  • выражение - символьное выражение, присваиваемое данной переменной и выравниваемое по левому (правому) краю.

  • Используйте LSET для присвоения записи переменной одного типа данных другому типу данных, определенному пользователем. Символьная переменная зачастую является переменной поля файла прямого доступа, описанной FIELD или любой другой символьной переменной (например: Pr$ = CPACE$ (20): RSET Pr$ =St$).

  • Если символьное выражение требует меньше байт, чем определено для переменной, операторы LSET (RSET) сдвигают его значение влево (вправо) добавляя пробелы в конец (начало) строки в противном случае и LSET и RSET отсекают лишние символы справа.

  1. OPEN "FILEDAT.DAT" FOR RANDOM AS #1 LEN = 10

FIELD #1, 5 AS Ls1$, 5 AS Rs1$

LSET Ls1$ = "ЛSET": RSET Rs1$ = "ПSET"

PUT #1, 1: CLOSE #1

OPEN "FILEDAT.DAT" FOR RANDOM AS #1 LEN = 10

FIELD #1, 5 AS Ls2$, 5 AS Rs2$

GET #1, 1: PRINT "*" + Ls2$ + "*", "*" + Rs2$ + "*"

CLOSE #1

FILEATTR

Функция

Возвращает информацию об открытом файле.

FILEATTR(номер_файла%, атрибут%)

  • номер_файла% - номер открытого файла;

  • атрибут% - указывает тип возвращаемой информации (1 или 2). Если атрибут% равен 1, FILEATTR возвращает значение, указывающее режим доступа к файлу:

  • 1 Ввод INPUT

  • 2 Вывод OUTPUT

  • 4 Прямой RANDOM

  • 8 Добавление APPEND

  • 32 Двоичный BINARY

  • Если атрибут% равен 2, FILEATTR возвращает указатель файла DOS.

  1. OPEN "GROUP.IMS" FOR BINARY AS #1

PRINT FILEATTR(1, 1)

CLOSE

FREEFILE

Функция

Возвращает номер следующего доступного неиспользуемого файла.

FREEFILE

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

  1. OPEN "ТЕСТ.ДАТ" FOR OUTPUT AS #1

PRINT "Номер следующего файла: "; FREEFILE

CLOSE

IOCTL

Оператор

Посылает управляющую строку драйверу устройства.

IOCTL [#] номер_файла%, строка$

  • номер_файла% - номер открытого устройства;

  • строка$ - управляющая строка, посылаемая в устройство. Длина строки не более 32767 байт.

  • Управляющая строка IOCTL зависит от драйвера устройства. Информацию об управляющей строке IOCTL , смотрите в документации на драйвер устройства.

  • Для работы оператора требуется чтобы:

  • драйвер устройства был установлен;

  • драйвер устройства был совместимым с оператором. Можно протестировать драйвер на поддержку IOSTL через функцию DOS 44h прерывания 21h используя CALL INTERRUPT.

  • устройство должно быть уже открыто OPEN.

IOCTL$

Функция

Возвращает информацию о текущем состоянии драйвера устройства.

IOCTL$([#] номер_файла%)

  • номер_файла% - номер открытого устройства.

  • Информация, возвращаемая IOCTL$, зависит от драйвера устройства. Информацию о том что возвращает IOCTL$, смотрите в документации на драйвер устройства.

  • Данная функция используется для проверки выполнения оператора IOSTL или для получения информации от драйвера о текущем статусе.

  • IOSTL не поддерживается LTP1:, COM1:, COM2:, SCRN:, CONS:.

  • Все замечания для оператора IOSTL, справедливы и для функции IOSTL$.

LOC

Функция

Возвращает текущую позицию в файле.

LOC(номер_файла%)

  • номер_файла% - номер открытого файла или устройства.

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

  • Для устройства COMn:, LOC возвращает число символов во входной очереди, ожидающей чтения. Значения зависят от того, открыто устройство как файл типа ASCII или двоичный. В первом случае - процедуры низкого уровня останавливают входной поток при получении символа EOF, для двоичного файла - EOF игнорируется и файл может читаться далее.

  • LOC не поддерживается LTPn:, KYBD:, SCRN:.

  1. OPEN "GROUP.IMS" FOR RANDOM AS #1

FOR i% = 1 TO 10

PUT #1, , i%

NEXT i%

SEEK #1, 2

GET #1, , i%

PRINT "Данные: "; i%; " Текущая запись: "; LOC(1); " Следующая: "; SEEK(1)

LOCK

UNLOCK

Операторы

LOCK ограничивает или закрывает доступ к файлу при работе в сети

UNLOCK отменяет ограничения, наложенные последним оператором LOCK.

LOCK [#] номер_файла% [ , запись& | [ начало& ] TO конец& ]

[ операторы ]

UNLOCK [#] номер_файла% [ , запись& | [ начало& ] TO конец& ]

  • номер_файла% - номер открытого устройства;

  • запись& - номер записи или байта, который требуется заблокировать для других процессов (от 1 до 2147483647 - байтовая позиция, от 1 до 32767 - запись). Длина записи - до 32767 байт;

  • начало& - номер начальной записи или байта;

  • конец& - номер конечной записи или байта.

  • Для файлов прямого доступа - аргументы запись&, начало&, конец& представляются в виде номера записи по отношению к началу файла. Для бинарных файлов - эти аргументы представляются в виде байтовой позиции относительно первого байта в файл. Для последовательных файлов LOCK и UNLOCK блокируют или деблокируют весь файл несмотря на указанные аргументы.

  • Операторы LOCK и UNLOCK всегда используются в паре. Аргументы у них также должны соответствовать.

  • Сбои при деблокировании могут привести к повреждению содержимого файла.

  1. 'Этот пример работает только в сети.

OPEN "GROUP.IMS" FOR RANDOM AS #1

FOR i% = 1 TO 10

PUT #1, , i%

NEXT i%

LOCK #1, 2 'Закрытие записи 2

GET #1, 2, i%

UNLOCK #1, 2 'Открытие записи 2

SEEK

Функция

Возвращает текущую позицию файла.

SEEK(номер_файла%)

  • номер_файла% - номер открытого файла любого типа доступа. Для файлов прямого доступа возвращает номер текущей записи. Для остальных - текущую байтовую позицию относительно начала файла. Первый байт или запись равны 1.

  • SEEK возвращает значение в пределах 1 - 2147483647 (эквивалентно 2^31-1).

  • Для устройства открытого как файл, функция возвращает 0.

  • SEEK не поддерживается LTPn:, KYBD:, COMn:, SCRN:, CONS:.

  1. OPEN "GROUP.IMS" FOR RANDOM AS #1

FOR i% = 1 TO 10

PUT #1, , i%

NEXT i%

SEEK #1, 2

GET #1, , i%

PRINT "Данные: "; i%; " Текущая запись: "; LOC(1); " Следующая: "; SEEK(1)

SEEK

Оператор

Устанавливает позицию файла для следующей записи или чтения.

SEEK [#]номер_файла%, позиция

  • номер_файла% - номер открытого OPEN файла;

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

  • Позиция должна быть в пределах 1 - 2147483647 (эквивалентно 2^31-1).

  • Номер записи, указанный в операторах GET и PUT, становится текущей позицией в файле.

  • Выполнение SEEK с отрицательным или нулевым значением позиции производит ошибку “Bad record number” (неверный номер записи).

  • При выполнении над оператором, неподдерживающим SEEK, действие оператора игнорируется и позиция не изменяется.

  1. OPEN "GROUP.IMS" FOR RANDOM AS #1

FOR i% = 1 TO 10

PUT #1, , i%

NEXT i%

SEEK #1, 2

GET #1, , i%

PRINT "Данные: "; i%; " Текущая запись: "; LOC(1); " Следующая: "; SEEK(1)