Страница 19 из 41
5.3.3 Открытие/закрытие файла. "Открыть" файл - это значит создать небольшие блоки памяти, которые будут содержать информацию о файле и служить промежуточ- ной станцией (буфером), через которую данные будут передаваться между файлом и памятью. Языки высокого уровня автоматически соз- дают для Вас эти блоки, а язык ассемблера - нет. При открытии файла каталог проверяется на его наличие. Если файла найден, то MS DOS берет информацию из каталога о размере и дате создания файла. Затем, при закрытии файла, система обновляет информацию в каталоге. Закрытие файла также очищает все системные буфера пере- носа, посылая на диск оставшуюся информацию. Если Вы не закроете файл перед завершением программы, то это может привести к потере данных. Если программа работает со многими файлами, то надо постоянно иметь ввиду сколько имеется одновременно открытых файлов. MS DOS 2.1 позволяет иметь до 99 одновременно открытых файлов, причем по умолчанию только 8 (измените это число с помощью команды MS DOS FILES). Бейсик позволяет иметь не более 15 открытых файлов. Каж- дый файл занимает место для блока параметров и буфера. Поскольку память для каждого файла отводится отдельно перед тем, как файлы открываются, то эта память недоступна для программ, даже если указанное число файлов не используется в настоящий момент. По этой причине Вы можете экономить память, устанавливая максимально допустимое число открытых файлов именно таким, которое требуется, с помощью описанного метода.
Высокий уровень. При открытии файла в Бейсике идет поиск в каталоге и если файл не найден, то создается новый файл с данным именем. Имеется два способа записи оператора открытия файла и в большинстве случаев оба эти способа эквивалентны. Единственное отличие состоит в том, что один из этих способов более закодирован, в то время как дру- гой ближе к естественному языку. В обоих операторах Вы должны указать по меньшей мере три сорта информации. Во-первых требуется имя файла и, поскольку это строка, оно должно быть заключено в
кавычки. Во-вторых, число, начиная с 1, присваивается файлу, как идентификационный номер, по которому другие операторы читают или пишут в файл. И в-третьих Вы должны указать для какой цели откры- вается данный файл, т.е. открыт ли он для прямого или для после- довательного доступа. Для открытия файла MYFILE.TXT для записи в последовательный файл, причем этот файл будет иметь номер 2, запишите или
OPEN "O",#2,"MYFILE.TXT"
или
OPEN "MYFILE.TXT" FOR OUTPUT AS #2
Отметим, что в обоих случаях номер 2 относится к буферу файла #2. Число может быть любым, не превосходящим числа разрешенных буфе- ров для файлов. Если поддерживается одновременная работа с шестью файлами, то число должно быть в интервале от 0 до 6. Однако буфер файла номер 1 не обязательно использовать раньше, чем файла номер 2. По умолчанию Бейсик устанавливает число буферов равное 8, но
Вы можете изменить это число на другое от 4 до 15. Из этих файлов четыре используются Бейсиком для своих нужд, поэтому по умолчанию только 4 файла доступны Вам для ввода/вывода. Для того чтобы установить число доступных буферов используйте параметр F: при запуске Бейсика. Например, если Вы при старте Бейсика напишите BASICA/F:10, то будет создано 10 буферов, шесть из которых дос- тупны для файловых операций. Второй параметр, S:, устанавливает размер буферов файла. Все буфера имеют один и тот же размер. По умолчанию берется размер в 128 байтов, однако допустимы размеры до 32767 байтов. Для файлов последовательного доступа этот размер может быть установлен рав- ным 0, что позволяет немного сэкономить память. Для файлов прямо- го доступа он должен быть не меньше максимального размера записи. Отметим, что есчи размер записи равен 512 байтам и размер буфера тоже 512 байт, то это приводит к ускорению дисковых операций. Команда BASICA/S:512/F:10 открывает 10 буферов размером 512 байт. Каждый файл требует 188 байтов плюс размер буфера, поэтому для такой конфигурации потребуется 7K памяти. Число буферов не может быть больше, чем разрешено иметь открытых файлов в DOS.
Кодированная форма: Первая из форм оператора OPEN использует одну букву для обоз- начения желаемого типа операций над файлом. Имеется три возмож- ности:
"O" открыть файл с последовательным доступом для вывода "I" открыть файл с последовательным доступом для ввода "R" открыть файл с прямым доступом для ввода/вывода
Последовательные файлы не могут записываться, когда они открыты для чтения и наоборот. В типичных случаях, последовательные файлы открываются для чтения, затем считываются целиком в память и
закрываются. После того как необходимые изменения внесены, файл снова открывается, но теперь для вывода и записываетсяобратно на диск, перекрывая то, что было записано в его секторах и, возмож- но, захватывая новые сектора. Следует отметить несколько моментов, относящихся к этой форме оператора OPEN. Имя файла должно содержать имя накопителя, если файл не найден на накопителе по умолчанию (т.е. накопителе, с которого запущен Бейсик). Имя файла может также содержать путь к файлу, находящемуся в подкаталоге, например OPEN "I",#1,"A:\LE- VEL1\LEVEL2\MYFILE.TXT". Кроме того, Вы можете поместить указание размера записи в конце оператора OPEN "R",#3,"MYFILE.TXT",52. В этом случае каждая запись будет занимать 52 байта дискового пространства. Если в операторе FIELDS не используются все 52 байта, то остаток пропадет. Этот параметр существенен при опера- циях с файлами прямого доступа. Большинство операций с файлами последовательного доступа не требуют указания длины записи, одна- ко Вы можете ускорить файловые операции, установив размер записи равным 512 байтам. Длина записи может быть в диапазоне от 1 до 32767 байтов и по умолчанию равна 128 байтам. |