Paskal_uchebn_posob_chast2_26_6_7
.pdf31 |
|
|
|
|
............ |
|
|
|
|
|
|
|
|
|
Процедура FLUSH. |
|
|
|
|
Очищает внутренний буфер файла и, таким |
образом, гарантирует |
|||
сохранность всех последних изменений файла |
на диске. Формат |
|||
обращения : |
|
|
|
|
FLUSH(<ф.п.>)
Любое обращение к файлу в Турбо Паскале осуществляется через некоторый буфер, что необходимо для согласования внутреннего представления файлового компонента (записи) с принятым в ДОС форматом хранения данных на диске. В ходе выполнения процедуры FLUSH все новые записи будут действительно записаны на диск.
Процедура игнорируется, если файл был инициирован для для чтения процедурой RESET.
Функция EOF (<ф.п.>):Boolean.
Логическая функция, тестирующая конец файла. Возвращает TRUE, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении- что файл исчерпан.
Процедура CHDIR.
Изменение текущего каталога.Формат обращения:
CHDIR(<путь>) |
|
Здесь <путь>-строковое выражение, |
содержащее путь к |
устанавливаему по умолчанию каталогу. |
|
Процедура GETDIR.
Позволяет определить имя текущего каталога (каталога по умолчанию). Формат обращения:
GETDIR(<устройство>,<каталог>)
Здесь <устройство>- выражение типа WORD, содержащее номер устройства: 0- устройство по умолчанию,1- диск A, 2- Диск B и т.д.;
PDF created with pdfFactory Pro trial version www.pdffactory.com
32
<каталог>- переменная типа STRING, в которой возвращается путь к текущему каталогу не указанном диске.
Процедура MKDIR.
Создает новый каталог на указанном диске. Формат обращения:
MKDIR(<каталог>)
Здесь <каталог>- Выражение типа STRING, задающее путь к каталогу. Последним именем в пути, т.е. именем вновь создоваемого каталога не может быть имя уже существующего каталога.
Процедура RMDIR.
Удаляет каталог. Формат обращения:
RMDIR (<каталог>)
Удаляемый каталог должен быть пустым, т.е. не содержать файлов или имен каталогов нижнего уровня.
Функция IORESULT:WORD.
Возвращает условный признак последней операции ввода-вывода. Если операция завершилась успешно, функция возвращает ноль. Следует помнить, что IORESULT становится доступной только при отключенном автоконтроле ошибок ввода-вывода. Директива компилятора{I-} отключает, а дирректива{I+} включает автоконтроль. Если автоконтроль устанавливает флаг ошибки и все последующие обращения к вводу-выводу блокируется, пока не будет вызвана функция IORESULT.
Ряд полезных файловых процедур и функций становится доступным при использовании библиотечного модуля DOS.TRU, входящего в стандартную библиотеку TURBO.TRL.Эти процедуры и функции указаны ниже. Доступ к ним возможен только после объявления USES DOS в начале программы.
Функция DISKFREE(<диск>):LONGINT.
Возвращает объем в байтах свободного пространства на указанном диске. При обращении к функции выражение <диск> типа BYTE
PDF created with pdfFactory Pro trial version www.pdffactory.com
33
определяет номер диска:0- устройство по умолчанию,1- диск A, 2- диск B и т.д. Функция возвращает значение-1, если указан номер несуществующего диска.
Функция DISKSIZE(<диск>):LONGINT.
Возвращает полный обьем диска в байтах или-1, если указан номер несуществующего диска.
Процедура FINDFIRST.
Возвращает атрибуты первого из файлов, зарегистрированных в указанном каталоге. Формат обращения:
FINDFIRST (<маска>,<атрибуты>,<имя>)
Здесь <маска>- строковое выражение, содержащее маску файла; <атрибуты>-выражение типа BYTE, содержащее уточнение к маске
(атрибуты);
<имя>- переменная типа SEARCHREC, в которой вудет возвращено имя файла. При формировании маски файла используются следующие символы-заменители ДОС.
* означает, что на месте этого символа может стоять сколько угодно (в том числе и ноль ) разрешенных символов имени или расширения файла;
? означает на месте этого символа может стоять один из разрешенных символов. Например: *.* -выбирает все файлы из каталога;
c*.* -выбирает все файлы с именами, начинающимися на
c(c1.pas,cc12345, c.dat и т.д.); |
|
|
|
|
a?.dat -выбирает имена файлов типа a0.dat,az.dat |
и т.д. |
|
||
Маске может предшевствовать путь. Например,команда |
|
|||
c:\dir\subdir\*.pas |
|
|
|
|
означает выбирать все файлы с расширением |
.PAS |
из |
каталога |
|
SUBDIR, находящегося на диске C; который, в свою очередь, входит в |
||||
корневой каталог. |
|
|
|
|
Байт<атрибуты> содержит двоичные разряды (биты), |
уточняющие, к |
|||
каким именно файлам разрешен доступ при |
общении |
к |
процедуре |
|
FINDFIRST. Вот так обьявляются файловые атрибуты в модуле |
||||
DOC.TRU: |
|
|
|
|
const |
|
|
|
|
ReadOnly =&01; { только чтение |
} |
|
|
|
Hidden =&02; { скрытый файл |
} |
|
|
|
PDF created with pdfFactory Pro trial version www.pdffactory.com
34 |
|
SysFile =&04; { системный файл |
} |
VolumelF =&08; { идентификатор тома }
Directory =&10; { имя подкаталога |
} |
|
Archive |
=&20; { архивный файл |
} |
AnyFile |
=&3F; { любой файл |
} |
Комбинацией бит в этом байте можно указывать самые разные варианты, например &06- выбирать все открытые и/или системные файлы.
Результат работы процедуры FINDFIRST возвращается в переменной типа SEARCHREC. Этот тип в модуле DOS.TRU определяется следующим образом:
type
SearchRec = record
Fill : array[1..21] of byte; Attr : byte;
Time : longint; Size : longint; Name : string[12] end;
Здесь Attr- атрибуты файла (см. выше);
Time- время создания или последнего обновления файла; возвращается в упаковонном формате; распаковать можно процедурой UNPACKTIME (см. ниже); Size- длина файла в байтах; Name- имя и расширение файла; Для распоковки параметра TIME исрользуется процедура
UNPACTIME (Time:longint; var T:DateTime). |
|
|
В модуле DOS.TRU объявлен следующий тип: |
|
|
type |
|
|
DateTime = record |
|
|
year |
: word; { год в формате 19хх } |
|
month |
: word; { месяц 1..12 |
} |
day |
: word; { день 1..31 |
} |
hour |
: word; { час 0..23 |
} |
mit |
: word; { минуты 0..59 |
} |
sec |
: word; { секунды 0..59 |
} |
Результат обращения к процедуре FINDFIRST можно |
||
проконролировать с |
помощью функции DOSERROR типа WORD, |
|
которая возвращает значения: |
|
|
0 - нет ошибок; |
|
|
2 - не неайден каталог; 18 - каталог пуст (нет указанных файлов).
PDF created with pdfFactory Pro trial version www.pdffactory.com
35
Процедура FINDNEXT.
Возвращает имя следующего файла в каталоге.Формат обращения: FINDNEXT(<сл.файл>)
Здесь <сл.файл> - запись типа SEARCHREC (см.выше), в которой возвращается информация о файле.
Следующая простая программа иллюстрирует способ использования процедур FINDFIRST и FINDNEXT. Программа выводит на экран список всех PAS-файлов текущего каталога:
Uses DOS; var S:SearchRec; begin
FindFirst('*.pas',AniFile,S); while DosError = 0 do begin
with S do Writeln(Name:12,Size:12); end
end.
Процедура GETFTIME.
Возвращает время создания или последнего обновления файла. Формат обращения:
GETFTIME(<ф.п.>,<время>)
Здесь <время> - переменная типа LONGINT, в которой возвращается время в упакованном формате.
Процедура SETFTIME.
Устанавливает новую дату создания или обновления файла. Формат обращения:
SETFTIME(<ф.п.>,<время>)
Здесь <время> - время и дата в упакованном формате.
Упаковать запись типа DATETIME в переменную типа LONGINT
можно процедурой PACKTIME(var T:DateTime; var Time:longint).(Описание типа DATETIME см.выше).
Процедура GETFATTR.
Позволяет получить атрибуты файла. Формат обращения: GETFATTR(<ф.п.>,<атрибуты>)
PDF created with pdfFactory Pro trial version www.pdffactory.com
36
Здесь <атрибуты> - переменная типа WORD, в младшем байте которой возвращаются устанавливаемые атрибуты файла.
Процедура SETFATTR.
Позволяет установить атрибуты файла. Формат обращения: SETFATTR(<ф.п.>,<атрибуты>)
Функция FSEARCH типа PATHSTR.
Ищет файл в списке каталогов. Формат обращения: FSEARCH(<имя>,<сп.каталогов>)
Здесь <имя> - имя отыскиваемого файла (строковое выражение или переменная типа PATHSTR=STRING[79]; имени может предшествовать путь);
<сп.каталогов> - список каталогов, в которых отыскивается файл (строковое выражение или переменная типа STRING); имена каталогов разделяются точкой с запятой.
Результат поиска возвращается функцией FSEARCH в виде строки типа PATHSTR=STRING[79]. В строке содержится путь и имя файла, если поиск был успешным, в противном случае возвращается пустая строка. Следует учесть, что поиск файла всегда начинается в текущем каталоге и только после этого продолжается в тех, что перечислены в <сп.каталогов>. Если файл обнаружен, дальнейший поиск прекращается, даже если часть каталогов осталась непросмотренной. В частности, если файл зарегестрирован в текущем каталоге, он "заслонит" собой одноименные файлы в других каталогах.
Пусть, например, имеется файл \SUBDIR\MYFILE.PAS. Тогда в случае, если текущий каталог - корневой, обращение FSEARCH ('MYFILE,PAS','\SUB; \SUBDIR')
вернет строку \SUBDIR\MYFILE.PAS, а обращение FSEARCH ('MYFILE.PAS','\SUB') вернет пустую строку. Однако, если текущим установлен каталог SUBDIR, то в обоих случаях вернется строка MYFILE.PAS (если файл находится в текущем каталоге, в выходной строке путь к нему не указывается).
Процедура FSPLIT.
"Расщепляет" имя файла, т.е. возвращает в качестве отдельных параметров путь к файлу, его имя и расширение. Формат обращения:
FSPLIT (<файл>,<путь>,<имя>,<расширение>)
Здесь <файл> - строковое выражение, содержащее спецификацию файла (имя с расширением и, возможно, с предшествующим путем);
PDF created with pdfFactory Pro trial version www.pdffactory.com
37
<путь> - переменная типа DIRSTR=STRING[67], в которой возвращается путь к файлу;
<имя> - переменная типа NAMESTR=STRING[8], в которой возвра- щается имя файла;
<расширение> - переменная типа EXTSTR=STRING[4], в котором возвращается расширение с предшествующей ему точкой.
Процедура не проверяет наличие на диске указанного файла.В
качестве входного параметра может использоваться переменная типа
PATHSTR=STRING[79].
Функция FEXPAND типа PATHSTR.
Дополняет файловое имя до полной спецификации, т.е. с указанием устройства и пути. Формат вызова:
FEXPAND (<файл>)
Здесь <файл> - строковое выражение или переменная типа
PATHSTR.
Функция не проверяет наличие указанного файла на диске, а просто дополняет имя файла недостающими параметрами - текущим устройством и путем к текущему каталогу. Результат возвращается в строке типа PATHSTR=STRING[79].
PDF created with pdfFactory Pro trial version www.pdffactory.com
38
ЛЕКЦИЯ 18. ТЕКСТОВЫЕ ФАЙЛЫ.
Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TEXT. Текстовые файлы
предназначены для хранения текстовой информации. |
Именно в такого |
||||
типа файлах |
хранятся, например,исходные |
тексты |
программ. |
||
Компоненты (записи) текстового файла могут иметь |
переменную длину, |
||||
что существенно влияет на характер работы с ними. |
|
|
|
||
Текстовый файл трактуется в |
Турбо-Паскале |
как |
совокупность |
||
строк переменной |
длины. Доступ |
к каждой строке |
возможен лишь |
последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится признак EOLN (End of line - конец строки), а в конце всего файла признак EOF (End of file - конец файла).
Эти признаки можно протестировать одноименными логическими функциями (см.ниже). При формировании текстовых файлов используются следующие системные соглашения:
EOLN - последовательность кодов ASCII 13 (CR) и 10 (LF); EOF - код 26 стандарта ASCII.
Для доступа к записям применяются процедуры READ, READLN, WRITE, WRITELN. Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять файловая переменная. В этом
случае происходит обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой ASSIGN. Если файловая переменная не указана, происходит обращение к стандартным файлам INPUT,OUTPUT.
Процедура READ.
Обеспечивает ввод символов, строк и чисел. Формат обращения: READ (<ф.п>,<сп.ввода>) или READ (<сп.ввода>)
Здесь <сп.ввода> - список ввода: последовательность из одной или более переменных типа CHAR, STRING, а так же любого целого или вещественного типа.
При вводе переменных типа CHAR выполняется чтение одного символа из файла и присваивания считанного значения переменной. Если
перед выполнением чтения указатель файла достиг конца очередной строки,то результатом чтения будет символ CR (ASCII код 13), а если достигнут конец файла то - символ EOF (код 26). При вводе с клавиатуры
PDF created with pdfFactory Pro trial version www.pdffactory.com
39
символ CR вводится при нажатии на клавишу "Ввод", а символ EOF - при одновременном нажатии на клавиши CTRL и Z.
При вводе переменных типа STRING количество считанных
процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR и EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если
количество символов во входном потоке данных больше максимальной длины строки, "лишние" символы до конца строки отбрасываются, а новое обращение к READ возвращает пустую строку. Таким образом, процедура READ не в состоянии прочесть последовательность строк: первая строка будет прочитана нормально, а все последующие окажутся
пустыми. |
Для ввода последовательности строк |
нужно использовать |
||||||
процедуру READLN (см.ниже). |
|
|
|
|
|
|
||
При вводе числовых переменных процедура READ вначале выделяет |
||||||||
подстроку во входном потоке по |
следующему |
правилу: |
все |
ведущие |
||||
пробелы, |
символы |
табуляции |
и |
маркеры |
конца |
строк EOLN |
||
пропускаются; после выделения первого значащего символа, |
наоборот, |
|||||||
любой из перечисленных символов или |
символ |
EOF служат признаком |
||||||
конца подстроки. |
Выделенная |
таким |
образом |
подстрока |
потом |
рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление, а полученное значение присваивается переменной. Если в подстроке был нарушен требуемый формат представления численной константы, возникает ошибка ввода вывода. Если при пропуске ведущих пробелов встретился символ EOF, переменная получит значение 0. Отметим, что в Турбо-Паскале не предусмотрен ввод шестнадцатиричных констант.
При использовании прцедуры READ применительно к стандартному файлу INPUT, т.е. при вводе с клавиатуры, символьные строки запоминаются в буфере, который передается процедуре только после
нажатия на клавишу "Ввод". |
Это позволяет редактировать данные при их |
|||
вводе. |
|
|
|
|
Для редактирования используются следующие клавиши: |
"Забой", |
|||
Ctrl-H, перевод курсора влево - стирают символ слева |
от курсора; |
|||
перевод курсора |
вправо |
- восстанавливает символ |
за |
символом |
предыдущую строку ввода; Ctrl-Z "Ввод" - завершает по процедуре READ; оставшиеся "лишние" символьные параметры принимают значение CHR(26), строки возвращаются пустыми, а численные переменные остаются без изменения.
Максимальная длина буфера ввода при работе с клавиатурой составляет 127 символов. Ввод с клавиатуры по процедуре READ сопровождается эхо-повтором вводимых символов на экране ПК.
PDF created with pdfFactory Pro trial version www.pdffactory.com
40
Процедура READ прекрасно приспособлена к вводу чисел. При
обращении к ней за вводом очередного целого или вещественного числа процедура "перескакивает" маркеры конца строк, т.е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовое представление чисел. В сочетании с проверкой конца файла функцией EOF процедура READ позволяет организовать простой ввод массивов данных, например, так:
const
N = 1000; { максимальная длина ввода } var
f : text;
m : array [1..N] of real; i : integer;
BEGIN
assign(f, 'prog.dat'); reset(f);
i := 1;
while not EOF(f) and (i <= N) do begin
read(f,m[i]);
inc(i);
end;
close(f);
............
ПРОЦЕДУРА READLN.
Обеспечивает ввод символов, строк и чисел. Эта процедура идентична процедуре READ за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки. Кроме того эту процедуру можно вызвать без параметра <сп.ввода> (см.процедуру READ), что приведет к пропуску всех символов текущей строки вплоть до EOLN.
Если процедура используется для чтения с клавиатуры, нажатие на клавишу "Ввод" отобразится на экране как последовательность CR+LF и курсор будет помещен в начало следующей строки, в то время как в процедуре READ эхо-повтором клавиши "Ввод" является символ CR и курсор перемещается в начало текущей строки.
PDF created with pdfFactory Pro trial version www.pdffactory.com