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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Учебная практика 2.
Системный модуль DOS, WinDOS.
Основные процедуры и функции для работы с файлами
1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:
Assign(<файловая_переменная>, <имя_дискового_файла>)
Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла строковая величина, т.е. должна быть заключена в апострофы. Например:
Пример процедуры Assign в Паскале
Assign (chf, 'G:\Home\ Student\ Lang\ Pascal\ primer.dat');
Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.
Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:
CON консоль, т.е. клавиатура-дисплей;
PRN принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.
Не разрешается связывать с одним физическим файлом более одной файловой переменной.
2.После окончания работы с файлами на Паскале, они должны быть закрыты.
Close(<список файловых переменных>);
При выполнении этой процедуры закрываются соответствующие физические файлы и фиксируются сделанные изменения. Следует иметь в виду, что при выполнении процедуры close связь файловой переменной с именем дискового файла, установленная ранее процедурой assign, сохраняется, следовательно, файл можно повторно открыть без дополнительного использования процедуры assign.
Работа с файлами заключается, в основном, в записи элементов в файл и считывании их из файла. Для удобства описания этих процедур введем понятие указателя, который определяет позицию доступа, т.е. ту позицию файла, которая доступна для чтения (в режиме чтения), либо для записи (в режиме записи). Позиция файла, следующая за последней компонентой файла (или первая позиция пустого файла) помечается специальным маркером, который отличается от любых компонент файла. Благодаря этому маркеру определяется конец файла.
3.Подготовка к записи в файл Паскаля
Rewrite(<имя_ф_переменной>);
Процедура Rewrite(f) (где f имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:
4.Запись в файл Паскаля
Write(<имя_ф_переменной>, <список записи>);
При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла.
Для типизированных файлов выполняется следующее утверждение: если в списке записи перечислено несколько выражений, то они записываются в файл, начиная с первой доступной позиции, а указатель смещается на число позиций, равное числу записываемых выражений.
5.Подготовка файла к чтению Паскаля
Reset(<имя_ф_переменной>);
Эта процедура ищет на диске уже существующий файл и переводит его в режим чтения, устанавливая указатель на первую позицию файла.
Если происходит попытка открыть для чтения не существующий еще на диске файл, то возникает ошибка ввода/вывода, и выполнение программы будет прервано.
6.Чтение из файла в Паскале
Read(<имя_ф_переменной>,<список переменных>);
Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.
В большинстве задач, в которых используются файлы, необходимо последовательно перебрать компоненты и произвести их обработку. В таком случае необходимо иметь возможность определять, указывает ли указатель на какую-то компоненту файла, или он уже вышел за пределы файла и указывает на маркер конца файла.
7.Функция определения достижения конца файла в Паскале
Eof(<имя_ф_переменной>);
Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции false.
8.Изменение имени файла в Паскале
Rename(<имя_ф_переменной>, <новое_имя_файла>);
Здесь новое_ имя_ файла строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.
Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.
9.Уничтожение файла в Паскале
Erase(<имя_ф_переменной>);
Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.
10.Уничтожение части файла от текущей позиции указателя до конца в Паскале
Truncate(<имя_ф_переменной>);
11.Файл Паскаля может быть открыт для добавления записей в конец файла
Append(<имя_ф_переменной>);
Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).
Перед первым обращением к процедурам ввода/вывода указатель файла стоит в его начале и указывает на его первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные и выражения в списках ввода и вывода в процедурах read() и write() должны иметь тот же тип, что и компоненты файла Паскаля. Если этих переменных или выражений в списке несколько, то указатель будет смещаться после каждой операции обмена данными на соответствующее число позиций.
Для облегчения перемещения указателя по файлу и доступа к компонентам типизированного файла существуют специальные процедуры и функции:
fileSize(<имя_ф_переменной>) функция Паскаля, определяющая число компонентов в файле;
filePos(<имя_ф_переменной>) функция Паскаля, значением которой является текущая позиция указателя;
seek(<имя_ф_переменной>,n) процедура Паскаля, смещающая указатель на компоненту файла с номером n. Так, процедура seek(<имя_ф_переменной>,0) установит указатель в начало файла, а процедура seek(<имя_ф_переменной>, FileSize(<имя_ф_переменной>)) установит указатель на признак конца файла.
Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.
Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.
В списке записываемых в текстовый файл элементов могут чередоваться в произвольном порядке числовые, символьные, строковые выражения. При этом строковые и символьные элементы записываются непосредственно, а числовые из машинной формы автоматически преобразуются в строку символов.
Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.
С помощью модулей Dos и WinDos реализуется целый ряд программ операционной системы и программ обработки файлов. Ни одна из программ модуля Dos не определена в стандартном Паскале, поэтому они помещаются в отдельный модуль.
Более полное описание операций DOS приведено в руководствах по DOS фирмы IBM.
Основное различие модулей Dos и WinDos состоит в том, что процедуры и функции модуля Dos используют стандартные строки Паскаля, а процедуры и функции модуля WinDos - строки с завершающим нулем. Стандартная строка Паскаля - это байт длины, за которым следует последовательность символов. Строка с завершающим нулем - это последовательность ненулевых символов с завершающим символом NULL (#0).
Функция DiskFree
Возвращает количество свободных байтов указанного диска.
Объявление:
function DiskFree(Drive: Byte): Longint;
Замечания:
Переменная Drive это диск для проверки, где A = 1, B = 2 и т.д. Если Drive = 0, то используется текущий диск.
Функция DiskFree может оказаться полезной для определения наличия свободного места на диске.
Функция DiskSize
Возвращает общий размер свободного места на диске, в байтах.
Объявление:
function DiskSize(Drive: Byte): Longint;
Переменная Drive это диск для проверки, где A = 1, B = 2 и т.д. Если Drive = 0, то используется текущий диск.
Функция DosExitCode
Возвращает код выхода из подпроцесса.
Объявление:
function DosExitCode: Word;
Функция DosVersion
Возвращает версию DOS.
Объявление:
function DosVersion: Word;
Функция EnvCount
Возвращает количество строк, содержащихся в системном окружении.
Объявление:
function EnvCount: Integer;
Функция EnvStr
Возвращает указанную строку окружения.
Объявление:
function EnvStr(Index: Integer): string;
Замечания:
Переменная Index это номер переменной окружения, например, первая переменная это 1, вторая 2 и т.д. Неправильный индекс возвращает пустую строку.
Функция EnvStr возвращает строку в форме (VarName=String). Если порядок переменных системного окружения неизвестен, то используют функцию GetEnvto для поиска переменной по имени.
Процедура Exec
Выполняет указанную программу с указанной командной строкой.
Объявление:
procedure Exec(Path, CmdLine: string);
Замечания:
Переменная Path это диск, директория и имя программы для выполнения. Переменная CmdLine содержит аргументы командной строки.
Процедура Exec передает управление программе, указанной в переменной Path. При этом распределение памяти не изменяется. После завершения процедуры Exec используйте функцию DosExitCode для определения кода выхода из программы. Процедура Exec также устанавливает значение переменной DosError, если случается ошибка.
Процедура Exec не выполняет программы, которые требуют Блок Управления Файлом - File Control Blocks (FCB).
Функция FExpand
Преобразует имя файла в полный путь к файлу.
Объявление:
function FExpand(Path: PathStr): PathStr;
Процедура FindFirst
Ищет указанный каталог для соответствующего файла.
Объявление:
procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);
Замечания:
Переменная Path это диск и каталог, в котором будет выполняться поиск и имя файла для поиска. Шаблоны следующие, например, 'MYFILE??.*'.
Переменная Attr содержит атрибуты файла для включения в поиск в добавление ко всем нормальным файлам.
Процедура FindFirst используется совмествно с процедурой FindNext. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.
Процедура FindNext
Находит следующее вхождение, которое соответствует имени и атрибутам, указанным в предварительно вызванной процедуре FindFirst.
Объявление:
procedure FindNext(var F: TSearchRec);
Замечания:
Процедура FindNext используется совместно с процедурой FindFirst. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска, предварительно определенных для процедуры FindFirst. Переменная F должна быть той же самой переменной, которая была использована для ввода в FindFirst. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.
Функция FSearch
Поиск файла.
Объявление:
function FSearch(Path: PathStr; DirList: string): PathStr;
Замечания:
Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная DirList это список директорий, разделенных точкой с запятой (;), которые будут включены в поиск.
Функция FSearch возвращает каталог и имя файла, если файл существует. Если файл, указанный в переменной Path, не найден в списке директорий, то возвращается пустая строка. Функция FSearch всегда начинает поиск с текущей директории, а затем проверяет директории, перечисленные в переменной DirList в том порядке, в котором они перечислены.
Процедура FSplit
Разделяет имя файла на три компонента.
Объявление:
procedure FSplit(Path: PathStr; var Dir: DirStr; var Name: NameStr; var Ext: ExtStr);
Замечания:
Используйте эту процедуру для разделения полного имени файла на три компонента: путь, имя файла и расширение файла. Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная Dir возвращает путь или часть переменной Path, которая содержит каталог (или каталоги). Переменная Name возвращает фактическое имя файла без расширения. Переменная Ext возвращает расширение файла, которому предшествует точка (.).
Возможно, что один или более компонентов вернутся пустыми. Это может случиться, если переменная Path не содержит этих компонентов. Например, в том случае, если в переменной Path указан пустой каталог.
Процедура GetCBreak
Возвращает состояние проверки Ctrl-Break в DOS.
Объявление:
procedure GetCBreak(var Break: Boolean);
Замечания:
Возвращает TRUE, если Ctrl-Break включена, иначе возвращает FALSE.
С включенной проверкой Ctrl-Break c все вызовы ввода/вывода (консоль, принтер и коммуникации) являются проверяемыми. Чтобы выключить Ctrl-Break, используйте процедуру SetCBreak.
Процедура GetDate
Возвращает текущую дату, установленную в операционной системе.
Объявление:
procedure GetDate(var Year, Month, Day, DayOfWeek: Word);
Функция GetEnv
Возвращает значение указанной переменной окружения.
Объявление:
function GetEnv(VarName: string): string;
Замечания:
VarName имя переменной для поиска. Если VarName не существует как переменная окружения, то возвращается пустая строка.
Функция GetEnv возвращает строку, назначенную для переменой окружения.
Процедура GetFAttr
Возвращает атрибуты файла.
Объявление:
procedure GetFAttr(var F; var Attr: Word);
Замечания:
F это файловая переменная, а также типизированный, нетипизированный или текстовый файл, который не открыт. Переменная Attr содержит атрибуты файла.
Файл, связываемый с переменной F, должен быть закрыт. Переменная Attr должна сравниваться с одной из констант атрибутов, которые определены в модуле DOS, с помощью ЛОГИЧЕСКОГО И (AND).
Ошибки записываются в переменную DosError, которая определена в модуле DOS. Для большей информации о файловых атрибутах обращайтесь к справочному руководству по вашей DOS.
Процедура GetFTime
Возвращает дату и время последнего изменения файла.
Объявление:
procedure GetFTime(var F; var Time: Longint);
Замечания:
Файл, связанный с переменной F должен быть открыт. Время может быть распаковано с помощью процедуры UnPackTime. Ошибки записываются в переменную DosError, которая определена в модуле DOS.
Процедура GetIntVec
Возвращает адрес, записанный в указанном векторе прерывания.
Объявление:
procedure GetIntVec(IntNo: Byte; var Vector: Pointer);
procedure GetIntVec(IntNo: Byte; var Vector: FarPointer);
Замечания:
Учтите, что процедура GetIntVec возвращает адрес прерывания защищенного режима. Чтобы получить вектор прерывания реального режима, используйте процедуру GetRealIntVec. Прерывания могут происходить в защищенном или реальном режиме.
Процедура GetTime
Возвращает текущее время, установленное в операционной системе.
Объявление:
procedure GetTime(var Hour, Minute, Second, Sec100: Word);
Замечания:
Диапазоны возвращаемых значений следующие: Hour (Час) [0..23], Minute (Минута) [0..59], Second (Секунда) [0..59] и Sec100 (сотая доля секунды) [0..99].
Процедура GetVerify
Возвращает состояние проверочного флага в DOS.
Объявление:
procedure GetVerify(var State: Boolean);
Замечания:
State = TRUE, если проверочный флаг DOS включен, иначе FALSE.
С включенным проверочным флагом DOS все выводимые на диск данные проверяются на целостность. Иначе выводимые данные не проверяются. Чтобы установить состояние проверочного флага DOS, используйте процедуру SetVerify.
Процедура Intr
Выполняет указанное программное прерывание.
Объявление:
procedure Intr(IntNo: Byte; var Regs: TRegisters);
Замечания:
Перед вызовом процедуры Intr, загрузите переменную Regs соответствующими параметрами, необходимыми для прерывания. Переменная Regs возвращает значения регистров после вызова прерывания. Вызовы, которые используют регистры ESP и SS не могут быть выполнены. Более подробную информацию о программных прерываниях ищите в руководствах на ваши BIOS и DOS.
Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль перед вызовом процедуры Intr. Все прерывания, вызов которых требует анализа смещения, должны использовать 32-битное смещение.
Процедура Keep
Эта процедура является только составляющей частью и всегда выдает сообщение об ошибке во время выполнения.
Объявление:
procedure Keep(ExitCode: Word);
Процедура MsDos
Выполняет вызов функции DOS.
Объявление:
procedure MsDos(var Regs: TRegisters);
Замечания:
Загрузите переменную Regs соответствующими параметрами перед вызовом MS-DOS. Переменная Regs возвращает значения регистров после вызова прерывания. Учтите, что тип TRegisters позволяет доступ к 32-битным регистрам. Вызовы DOS, которые используют регистры ESP и SS не могут быть выполнены. Для прерывания, отличного от $21, используйте процедуру Intr. Более подробную информацию о программных прерываниях DOS ищите в руководствах на вашу DOS.
Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль для использования MS-DOS.
Процедура PackTime
Преобразует запись DateTime.
Объявление:
procedure PackTime(var T: DateTime; var Time: Longint);
Замечания:
Процедура PackTime может быть использована совместно с процедурой SetFTime. Для распаковки 4-х байтового пакета дата/время в запись DateTime используйте процедуру UnpackTime.
Процедура SetCBreak
Устанавливает состояние проверки Ctrl-Break.
Объявление:
procedure SetCBreak(Break: Boolean);
Замечания:
С включенной проверкой Ctrl-Break, проверяются все вызовы операций ввода/вывода (консоль, принтер и коммуникации). Чтобы получить состояние Ctrl-Break, используйте процедуру GetCBreak.
Процедура SetDate
Устанавливает текущую дату в операционной системе.
Объявление:
procedure SetDate(Year, Month, Day: Word);
Замечания:
Неправильная дата игнорируется операционной системой. Для получения текущей даты используйте процедуру GetDate.
Процедура SetFAttr
Устанавливает атрибуты файла.
Объявление:
procedure SetFAttr(var F; Attr: Word);
Замечания:
Файл, связанный с переменной F должен быть закрыт. Переменная Attr должна быть сформирована с помощью операции ЛОГИЧЕСКОЕ ИЛИ (OR) между этой переменной и одной из констант файловых атрибутов. Эти константы определенны в модуле DOS.
Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию о файловых атрибутах ищите в руководствах на вашу DOS.
Процедура SetFTime
Устанавливает дату и время последнего изменения файла.
Объявление:
procedure SetFTime(var F; Time: Longint);
Замечания: Файл, связанный с переменной F должен быть открыт. Упакованный формат дата/время может быть создан с помощью процедуры PackTime. Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию об упакованном формате дата/время ищите в руководствах на вашу DOS.
Процедура SetIntVecs
Устанавливает указанный вектор прерывания для указанного адреса.
Объявление:
procedure SetIntVec(IntNo: Byte; Vector: Pointer);
procedure SetIntVec(IntNo: Byte; Vector: FarPointer);
Замечания:
Прерывания могут происходить в защищенном или реальном режиме.
Процедура SetTime
Устанавливает текущее время в операционной системе.
Объявление:
procedure SetTime(Hour, Minute, Second, Sec100: Word);
Замечания:
Неправильное значение игнорируется. Для получения текущего времени операционной системы используйте процедуру GetTime.
Процедура SetVerify
Устанавливает состояние флага проверки в DOS.
Объявление:
procedure SetVerify(Verify: Boolean);
Процедура SwapVectors
Процедура SwapVectors ничего не делает и предоставляется только для совместимости с Borland Pascal.
Объявление: procedure SwapVectors;
Процедура UnpackTime
Преобразует переменную типа Longint в запись.
Задание для самостоятельной работы.
1. Написать программу для работы с файлами. При запуске программа должна выдавать главное меню с выбором команд.
2. Написать программу-таймер. В программе необходимо реализовать несколько режимов работы таймера.
Индивидуальное задание:
Добавить пятый пункт в главное меню. При выборе пункта 5 программа начинает отсчитывать время до Вашего дня рождения.
3. Добавить к программе 1 навигацию посредством стрелок. Пункты меню должны выбираться перемещением стрелок. Подтверждение выбора осуществляется клавишей <Enter>