Вредоносное ПО (malware) - это назойливые или опасные программы,...
Изучаем Linux, 101
Редактирование файлов с помощью vi
Редактор, который всегда под рукой
Серия контента:
Краткий обзор
Из этой статьи вы узнаете об основных приемах работы с редактором vi, который есть практически в каждом дистрибутиве UNIX или Linux. Вы научитесь:
- Перемещаться по документу с помощью vi.
- Использовать основные режимы vi.
- Вставлять, редактировать, удалять, копировать и искать текст.
Об этой серии
Эта серия статей поможет вам освоить задачи администрирования операционной системы Linux. Вы также можете использовать материал этих статей для подготовки к .
Чтобы посмотреть описания статей этой серии и получить ссылки на них, обратитесь к нашему . Этот перечень постоянно дополняется новыми статьями по мере их готовности и содержит самые последние (по состоянию на апрель 2009 года) цели экзаменов сертификации LPIC-1. Если какая-либо статья отсутствует в перечне, можно найти ее более раннюю версию, соответствующую предыдущим целям LPIC-1 (до апреля 2009 года), обратившись к нашим .
Эта статья поможет вам подготовиться к сдаче экзамена LPI 101 на администратора начального уровня (LPIC-1) и содержит материалы цели 103.8 темы 103. Цель имеет вес 3.
Предварительные требования
Чтобы извлечь наибольшую пользу из наших статей, необходимо обладать базовыми знаниями о Linux и иметь работоспособный компьютер с Linux, на котором можно будет выполнять все встречающиеся команды. Иногда различные версии программ выводят результаты по-разному, поэтому содержимое листингов и рисунков может отличаться от того, что вы увидите на вашем компьютере.
Перемещение по документу с помощью vi
Как связаться с Яном
Ян – один из наших наиболее популярных и плодовитых авторов. Ознакомьтесь со (EN), опубликованными на сайте developerWorks. Вы можете найти контактные данные в и связаться с ним, а также с другими авторами и участниками ресурса My developerWorks.
Редактор vi есть практически в каждом дистрибутиве Linux и UNIX. Фактически, если в операционной системе имеется только один редактор, то, скорее всего, это именно vi, поэтому очень важно уметь работать с ним. В этой статье представлены лишь основные команды редактирования vi, а полную информацию о vi вы можете найти в руководстве " " (EN) на сайте developerWorks, на соответствующих man-страницах или в одной из многочисленных книг, посвященных этому редактору.
Запуск vi
Сегодня многие дистрибутивы Linux поставляются с редактором vim (V i IM proved – улучшенный vi), а не с классической версией vi. Редактор vim обратно совместим с vi, и помимо стандартного текстового интерфейса имеет графический интерфейс (gvim). Обычно команда vi является символической ссылкой на программу vim. Существует несколько версий vim: крошечный (tiny), маленький (small), обычный (normal), большой (big) и огромный (huge). Версию vim, которая используется в вашей операционной системе, а также ее возможности, можно узнать с помощью команды
vi --versionВ предыдущей статье этой серии " " мы хотели изменить приоритет работающего сценария командной оболочки count1.sh. Если вы пытались сделать это самостоятельно, то, возможно, обнаружили, что команды выполнялись настолько быстро, что вы не успевали изменить приоритет с помощью renice . Итак, давайте начнем работу с редактором vi и добавим в начало сценария строку для вставки 20-секундной паузы, благодаря которой мы сможем успеть изменить приоритет.
Если у вас нет под рукой сценария count1.sh, то можно сделать следующее: откройте окно терминала, перейдите в вашу домашнюю директорию и скопируйте в окно содержимое листинга 1. В результате в вашей домашней директории будет создана поддиректория lpi103-8, содержащая файл сценария count1.sh.
Листинг 1. Сценарий, нагружающий центральный процессор – count1.sh
mkdir -p lpi103-8 && cd lpi103-8 && {echo "x="$1"">count1.shecho "echo "$2" $(date)">>count1.shecho "while [ $x -gt 0 ]; do x=$((x-1));done">>count1.shecho "echo "$2" $(date)">>count1.sh }Для редактирования существующего файла наберите команду vi , указав имя этого файла в качестве параметра. Подробную информацию о различных опциях вы можете найти на man-страницах или в разделе , а пока давайте запустим редактор без каких-либо опций:
vi count1.sh
В результате должен открыться файл count1.sh. Вы должны увидеть нечто похожее на листинг 2. Если вы используете vim, то некоторые слова или символы могут быть выделены цветом. В редакторе vim имеется режим выделения цветом (отсутствующий в оригинальном vi), который может быть включен в вашей системе по умолчанию.
Листинг 2. Редактирование сценария count1.sh в vi
x="$1" echo "$2" $(date) while [ $x -gt 0 ]; do x=$((x-1));done echo "$2" $(date) ~ ~ ~ ~ "count1.sh" 4L, 84C 1,1 AllРедактор vi начал разрабатываться еще в те времена, когда не все терминальные клавиатуры имели клавиши управления курсором, поэтому в vi вы можете делать все с помощью клавиш, расположенных на стандартной буквенно-цифровой клавиатуре, а также нескольких специальных клавиш, таких как Esc и Insert . Тем не менее, вы можете настроить vi на использование дополнительных клавиш современной компьютерной клавиатуры; большинство клавиш из имеющихся на вашей клавиатуре выполняют в vi какие-то полезные действия. Благодаря своему наследию, а также медленным подключениям старых терминалов, vi имеет заслуженную репутацию редактора, в котором используются краткие и загадочные команды. Давайте начнем с рассмотрения комбинаций клавиш, предназначенных для навигации по файлам.
Перемещение
Следующие команды предназначены для перемещения по файлу:
h Перейти на один символ влево в текущей строке. j Перейти к следующей строке. k Перейти к предыдущей строке. l Перейти на один символ вправо в текущей строке. w Перейти к следующему слову в текущей строке. e Перейти к концу текущего слова в текущей строке. b Перейти к началу текущего слова в текущей строке. Ctrl-f Прокрутить одну страницу вперед. Ctrl-b Прокрутить одну страницу назад.Если вы наберете перед любой из этих команд число, то команда будет выполнена указанное количество раз. Это число называется счетчиком повторений или просто счетчиком . Например, команда 5h переместит курсор на пять символов влево. Счетчики повторений можно использовать со многими командами vi.
Перемещение по строкам
Следующие команды предназначены для перехода к определенным строкам файла.
G Перейти к определенной строке файла. Например, команда 3G перемещает курсор к строке 3. Команда G без каких-либо параметров перемещает курсор к последней строке файла. H Перейти к определенной строке относительно верхнего края экрана. Например, команда 3H перемещает курсор к третьей строке относительно верхнего края экрана. L Подобна команде H, но отсчет происходит относительно последней строки экрана. Таким образом, команда 2L перемещает курсор на вторую строку относительно нижней строки экрана.Поработайте с этими командами и научитесь свободно использовать их. Если в процессе работы что-то пойдет не так, то всегда можно выйти из vi. Как это сделать, рассказывается далее.
Выход из vi
Всегда необходимо уметь выйти из редактора. Это позволит не испортить важный файл, если при его редактировании вы допустите какую-либо критическую ошибку. Из vi можно выйти следующими способами: с сохранением изменений, без сохранения изменений, с перезапуском редактирования файла с самого начала. Если приведенные ниже команды не работают, то проверьте, не находитесь ли вы в режиме вставки, о котором вы узнаете чуть позже. Если вы сомневаетесь, то нажмите клавишу Esc для выхода из режима вставки и возврата в режим команд, в котором эти команды должны работать.
:q! Завершить редактирования файла с отменой всех изменений. Эта команда очень часто используется при возникновении трудностей. :w! Записать файл (независимо от того, был ли он изменен или нет). Предпринимается попытка перезаписать существующие файлы, файлы с доступом только для чтения или другие неперезаписываемые файлы. В качестве параметра можно указать имя, под которым будет сохранен исходный файл, который вы начинали редактировать. Зачастую безопаснее не использовать символ!, если вы не уверены на все 100% в том, что вы сделали. ZZ Записать файл, если он был изменен, а затем выйти из редактора. Эта команда обычно используется для нормального выхода из vi. :e! Редактировать текущую копию файла на диске. Выполняется повторная загрузка файла с отменой всех внесенных изменений. Эту команду можно также использовать в тех случаях, когда файл на диске по какой-то причине был изменен и вам требуется использовать его последнюю версию. :! Запустить команду интерпретатора. Наберите команду и нажмите клавишу Enter . По завершении работы команды вы увидите ее вывод и приглашение вернуться в редактор vi.Примечания.
- Когда вы набираете двоеточие (:), курсор перемещается в нижнюю строку экрана, в которой можно набирать команду и ее параметры.
- Если в вышеперечисленных командах пропустить восклицательный знак, то можно получить сообщение о ошибке, например, о невозможности сохранения изменений или записи в конечный файл (если вы редактируете файл с доступом только на чтение).
- Существуют длинные формы команд: (:quit, :write, :edit), однако используются они редко.
Режимы vi
Редактор vi может работать в двух режимах.
Режим команд В режиме команд вы перемещаетесь по файлу и редактируете файл, выполняя такие операции, как поиск, удаление, изменение текста и так далее. Обычно vi запускается в режиме команд. Режим вставки В режиме вставки вы набираете новый текст, начиная с позиции курсора. Для возврата в режим команд нажмите клавишу Esc .Эти два режима определяют поведение редактора. Все, что вы набираете в режиме вставки, считается текстом, который необходимо вставлять в файл. Если вы пытаетесь набрать команду, и ничего не происходит (или символы появляются под курсором), то, вероятно, вы забыли нажать клавишу Esc для выхода из режима вставки.
Редактирование текста
Теперь, когда вы умеете открывать файлы в редакторе vi, перемещаться по ним и выходить из vi, пришло время узнать, как редактировать текст в файле.
Изменение текста
Для вставки, удаления или изменения текста используйте следующие команды. Заметьте, что некоторые из них могут быть записаны как в верхнем, так и в нижнем регистре (описание будет дано ниже).
i Перейти в режим вставки перед символом в текущей позиции. Наберите текст и нажмите клавишу Esc для возврата в режим команд. Используйте команду I для вставки текста в начале текущей строки. a Перейти в режим вставки после символа в текущей позиции. Наберите текст и нажмите клавишу Esc для возврата в режим команд. Используйте команду A для вставки текста в конце текущей строки. c Изменить текущий символ и перейти в режим вставки для ввода символов замены. o Вставить новую строку после текущей строки. Используйте команду O для вставки новой строки над текущей строкой. cw Удалить оставшуюся часть текущего слова и перейти в режим вставки для его замены. Используйте счетчик повторений для замещения нескольких слов. Используйте команду c$ для замены оставшейся части строки. dw То же самое, что и cw (и c$), но без перехода в режим вставки. dd Удалить текущую строку. Используйте счетчик повторений для удаления нескольких строк. x Удалить символ в позиции курсора. Используйте счетчик повторений для удаления нескольких символов. p Поместить последний удаленный текст после текущего символа. Используйте команду P, чтобы поместить текст перед текущим символом. xp Полезная команда из комбинации x и p. Замещает символ в позиции курсора символом, находящимся справа от него.Поиск текста
Вы можете искать текст в файле, используя регулярные выражения.
/ Используйте регулярное выражение после символа / для прямого поиска в файле. ? Используйте регулярное выражение после символа? для поиска в файле в обратном направлении. n Используйте n для повторения последнего поиска в любом из направлений.Все вышеперечисленные команды можно предварять счетчиком повторений. Так, команда 3/x (так же, как и команда /x, после которой следует 2n) будет искать третье вхождение x, начиная с текущей позиции. Аналогично, команда 2/^e будет искать вторую строку, начинающуюся на e, относительно текущей позиции.
Обратите внимание на то, что при достижении конца файла поиск продолжится с начала файла.
Справочная информация
Еще одна полезная команда vi – это команда справки, которую можно вызвать, набрав:help . Справка открывается в самом редакторе vi; используйте команду:q , чтобы закрыть справку и продолжить работу. Если вам необходима информация по какой-то определенной тематике (например, перестановка строк), то попробуйте добавить соответствующее слово после команды:help, например, :help wrap .
Собираем все вместе
В начале статьи мы собирались добавить строку в наш файл count1.sh. Чтобы сохранить исходный файл и записать его измененную версию под именем count2.sh, мы можем использовать команды редактора после того, как откроем этот файл при помощи команды vi . Заметьте, что обозначение
Листинг 3. Команды редактора для добавления строки в файл count1.sh
1GOsleep 20Эти команды выполняют следующие действия:
1G Переход в первую строку файла. O Добавление новой строки над текущей строкой и переход в режим вставки. sleep 20 Текст, который необходимо добавить.Все просто, когда знаешь, как.
Эта статья последняя из серии статей по теме 103 экзамена LPI 101 на администратора начального уровня (LPIC-1). Ссылки на остальные статьи этой серии вы можете найти в .
Работа добавлена на сайт сайт: 2016-03-30">Учебная практика 2.
">Системный модуль " xml:lang="en-US" lang="en-US">DOS ">, " xml:lang="en-US" lang="en-US">WinDOS ">.
">Файлы в Паскале
Основные процедуры и функции для работы с файлами
">1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:
">Assign(<файловая_переменная>, <имя_дискового_файла>)
">Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла строковая величина, т.е. должна быть заключена в апострофы. Например " xml:lang="en-US" lang="en-US">:
">Пример " xml:lang="en-US" lang="en-US"> ">процедуры " xml:lang="en-US" lang="en-US"> Assign ">в " xml:lang="en-US" lang="en-US"> ">Паскале " xml:lang="en-US" lang="en-US">
" xml:lang="en-US" lang="en-US"> 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 после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.
" xml:lang="en-US" lang="en-US">DOS
">С помощью модулей Dos и WinDos реализуется целый ряд программ операционной системы и программ обработки файлов. Ни одна из программ модуля Dos не определена в стандартном Паскале, поэтому они помещаются в отдельный модуль.
">Более полное описание операций DOS приведено в руководствах по DOS фирмы IBM.
">Основное различие модулей Dos и WinDos состоит в том, что процедуры и функции модуля Dos используют стандартные строки Паскаля, а процедуры и функции модуля WinDos - строки с завершающим нулем. Стандартная строка Паскаля - это байт длины, за которым следует последовательность символов. Строка с завершающим нулем - это последовательность ненулевых символов с завершающим символом NULL (#0).
">Процедуры и функции модуля " xml:lang="en-US" lang="en-US">Dos ">.
Функция DiskFree
"> Возвращает количество свободных байтов указанного диска.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function DiskFree(Drive: Byte): Longint;
">Замечания:
"> Функция DiskFree может оказаться полезной для определения наличия свободного места на диске.
Функция DiskSize
"> Возвращает общий размер свободного места на диске, в байтах.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function DiskSize(Drive: Byte): Longint;
" xml:lang="en-US" lang="en-US"> ">Переменная Drive это диск для проверки, где A = 1, B = 2 и т.д. Если Drive = 0, то используется текущий диск.
Функция DosExitCode
"> Возвращает код выхода из подпроцесса.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function DosExitCode: Word;
Функция DosVersion
" xml:lang="en-US" lang="en-US"> ">Возвращает " xml:lang="en-US" lang="en-US"> ">версию " xml:lang="en-US" lang="en-US"> DOS.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function DosVersion: Word;
Функция EnvCount
">Возвращает количество строк, содержащихся в системном окружении.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function EnvCount: Integer;
Функция EnvStr
" xml:lang="en-US" lang="en-US"> ">Возвращает указанную строку окружения.
">Объявление:
" xml:lang="en-US" lang="en-US">function EnvStr(Index: Integer): string;
">Замечания:
"> Переменная Index это номер переменной окружения, например, первая переменная это 1, вторая 2 и т.д. Неправильный индекс возвращает пустую строку.
"> Функция EnvStr возвращает строку в форме (VarName=String). Если порядок переменных системного окружения неизвестен, то используют функцию GetEnvto для поиска переменной по имени.
Процедура Exec
"> Выполняет указанную программу с указанной командной строкой.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure Exec(Path, CmdLine: string);
">Замечания:
"> Переменная Path это диск, директория и имя программы для выполнения. Переменная CmdLine содержит аргументы командной строки.
"> Процедура Exec передает управление программе, указанной в переменной Path. При этом распределение памяти не изменяется. После завершения процедуры Exec используйте функцию DosExitCode для определения кода выхода из программы. Процедура Exec также устанавливает значение переменной DosError, если случается ошибка.
"> Процедура Exec не выполняет программы, которые требуют Блок Управления Файлом - File Control Blocks (FCB).
Функция FExpand
"> Преобразует имя файла в полный путь к файлу.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function FExpand(Path: PathStr): PathStr;
Процедура FindFirst
"> Ищет указанный каталог для соответствующего файла.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure FindFirst(Path: PChar; Attr: Word; var F: TSearchRec);
">Замечания:
"> Переменная Path это диск и каталог, в котором будет выполняться поиск и имя файла для поиска. Шаблоны следующие, например, "MYFILE??.*".
"> Переменная Attr содержит атрибуты файла для включения в поиск в добавление ко всем нормальным файлам.
"> Процедура FindFirst используется совмествно с процедурой FindNext. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.
Процедура FindNext
"> Находит следующее вхождение, которое соответствует имени и атрибутам, указанным в предварительно вызванной процедуре FindFirst.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure FindNext(var F: TSearchRec);
">Замечания:
"> Процедура FindNext используется совместно с процедурой FindFirst. Используйте FindNext для размещения каких-либо дополнительных файлов, соответствующих критериям поиска, предварительно определенных для процедуры FindFirst. Переменная F должна быть той же самой переменной, которая была использована для ввода в FindFirst. Все ошибки записываются в переменную DosError, которая определена в модуле DOS.
Функция FSearch
"> Поиск файла.
">Объявление:
" xml:lang="en-US" lang="en-US">function FSearch(Path: PathStr; DirList: string): PathStr;
">Замечания:
"> Переменная Path имеет тип PathStr, который определен в модуле DOS. Переменная DirList это список директорий, разделенных точкой с запятой (;), которые будут включены в поиск.
"> Функция FSearch возвращает каталог и имя файла, если файл существует. Если файл, указанный в переменной Path, не найден в списке директорий, то возвращается пустая строка. Функция FSearch всегда начинает поиск с текущей директории, а затем проверяет директории, перечисленные в переменной DirList в том порядке, в котором они перечислены.
Процедура FSplit
"> Разделяет имя файла на три компонента.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">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.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetCBreak(var Break: Boolean);
">Замечания:
"> Возвращает TRUE, если Ctrl-Break включена, иначе возвращает FALSE.
"> С включенной проверкой Ctrl-Break c все вызовы ввода/вывода (консоль, принтер и коммуникации) являются проверяемыми. Чтобы выключить Ctrl-Break, используйте процедуру SetCBreak.
Процедура GetDate
"> Возвращает текущую дату, установленную в операционной системе.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetDate(var Year, Month, Day, DayOfWeek: Word);
Функция GetEnv
"> Возвращает значение указанной переменной окружения.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">function GetEnv(VarName: string): string;
">Замечания:
">VarName имя переменной для поиска. Если VarName не существует как переменная окружения, то возвращается пустая строка.
">Функция GetEnv возвращает строку, назначенную для переменой окружения.
Процедура GetFAttr
">Возвращает атрибуты файла.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetFAttr(var F; var Attr: Word);
">Замечания:
">F это файловая переменная, а также типизированный, нетипизированный или текстовый файл, который не открыт. Переменная Attr содержит атрибуты файла.
"> Файл, связываемый с переменной F, должен быть закрыт. Переменная Attr должна сравниваться с одной из констант атрибутов, которые определены в модуле DOS, с помощью ЛОГИЧЕСКОГО И (AND).
"> Ошибки записываются в переменную DosError, которая определена в модуле DOS. Для большей информации о файловых атрибутах обращайтесь к справочному руководству по вашей DOS.
Процедура GetFTime
">Возвращает дату и время последнего изменения файла.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetFTime(var F; var Time: Longint);
">Замечания:
"> Файл, связанный с переменной F должен быть открыт. Время может быть распаковано с помощью процедуры UnPackTime. Ошибки записываются в переменную DosError, которая определена в модуле DOS.
">Процедура GetIntVec
">Возвращает адрес, записанный в указанном векторе прерывания.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetIntVec(IntNo: Byte; var Vector: Pointer);
" xml:lang="en-US" lang="en-US">procedure GetIntVec(IntNo: Byte; var Vector: FarPointer);
">Замечания:
"> Учтите, что процедура GetIntVec возвращает адрес прерывания защищенного режима. Чтобы получить вектор прерывания реального режима, используйте процедуру GetRealIntVec. Прерывания могут происходить в защищенном или реальном режиме.
Процедура GetTime
">Возвращает текущее время, установленное в операционной системе.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetTime(var Hour, Minute, Second, Sec100: Word);
">Замечания:
"> Диапазоны возвращаемых значений следующие: Hour (Час) , Minute (Минута) , Second (Секунда) и Sec100 (сотая доля секунды) .
Процедура GetVerify
"> Возвращает состояние проверочного флага в DOS.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure GetVerify(var State: Boolean);
">Замечания:
">State = TRUE, если проверочный флаг DOS включен, иначе FALSE.
"> С включенным проверочным флагом DOS все выводимые на диск данные проверяются на целостность. Иначе выводимые данные не проверяются. Чтобы установить состояние проверочного флага DOS, используйте процедуру SetVerify.
Процедура Intr
"> Выполняет указанное программное прерывание.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure Intr(IntNo: Byte; var Regs: TRegisters);
">Замечания:
"> Перед вызовом процедуры Intr, загрузите переменную Regs соответствующими параметрами, необходимыми для прерывания. Переменная Regs возвращает значения регистров после вызова прерывания. Вызовы, которые используют регистры ESP и SS не могут быть выполнены. Более подробную информацию о программных прерываниях ищите в руководствах на ваши BIOS и DOS.
"> Учтите, что все сегментные регистры (DS,ES,FS,GS) должны содержать допустимые значения сегментных дескрипторов или быть установлены в ноль перед вызовом процедуры Intr. Все прерывания, вызов которых требует анализа смещения, должны использовать 32-битное смещение.
Процедура Keep
">Эта процедура является только составляющей частью и всегда выдает сообщение об ошибке во время выполнения.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure Keep(ExitCode: Word);
Процедура MsDos
" xml:lang="en-US" lang="en-US"> ">Выполняет вызов функции DOS.
">Объявление:
" xml:lang="en-US" lang="en-US">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
"> Преобразует запись " xml:lang="en-US" lang="en-US">DateTime ">.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure PackTime(var T: DateTime; var Time: Longint);
">Замечания:
"> Процедура PackTime может быть использована совместно с процедурой SetFTime. Для распаковки 4-х байтового пакета дата/время в запись DateTime используйте процедуру UnpackTime.
Процедура SetCBreak
"> Устанавливает состояние проверки Ctrl-Break.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetCBreak(Break: Boolean);
">Замечания " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US"> ">С включенной проверкой Ctrl-Break, проверяются все вызовы операций ввода/вывода (консоль, принтер и коммуникации). Чтобы получить состояние Ctrl-Break, используйте процедуру GetCBreak.
Процедура SetDate
"> Устанавливает текущую дату в операционной системе.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetDate(Year, Month, Day: Word);
">Замечания:
"> Неправильная дата игнорируется операционной системой. Для получения текущей даты используйте процедуру GetDate.
Процедура SetFAttr
"> Устанавливает атрибуты файла.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetFAttr(var F; Attr: Word);
">Замечания:
"> Файл, связанный с переменной F должен быть закрыт. Переменная Attr должна быть сформирована с помощью операции ЛОГИЧЕСКОЕ ИЛИ (OR) между этой переменной и одной из констант файловых атрибутов. Эти константы определенны в модуле DOS.
"> Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию о файловых атрибутах ищите в руководствах на вашу DOS.
">Процедура " xml:lang="en-US" lang="en-US">SetFTime
"> Устанавливает дату и время последнего изменения файла.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetFTime(var F; Time: Longint);
">Замечания: Файл, связанный с переменной F должен быть открыт. Упакованный формат дата/время может быть создан с помощью процедуры PackTime. Ошибки записываются в переменную DosError, определенную в модуле DOS. Более подробную информацию об упакованном формате дата/время ищите в руководствах на вашу DOS.
Процедура SetIntVecs
"> Устанавливает указанный вектор прерывания для указанного адреса.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetIntVec(IntNo: Byte; Vector: Pointer);
" xml:lang="en-US" lang="en-US">procedure SetIntVec(IntNo: Byte; Vector: FarPointer);
">Замечания:
"> Прерывания могут происходить в защищенном или реальном режиме.
Процедура SetTime
"> Устанавливает текущее время в операционной системе.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetTime(Hour, Minute, Second, Sec100: Word);
">Замечания:
"> Неправильное значение игнорируется. Для получения текущего времени операционной системы используйте процедуру GetTime.
Процедура SetVerify
"> Устанавливает состояние флага проверки в DOS.
">Объявление " xml:lang="en-US" lang="en-US">:
" xml:lang="en-US" lang="en-US">procedure SetVerify(Verify: Boolean);
Процедура SwapVectors
" xml:lang="en-US" lang="en-US"> ">Процедура SwapVectors ничего не делает и предоставляется только для совместимости с Borland Pascal.
">Объявление: procedure SwapVectors;
Процедура UnpackTime
"> Преобразует переменную типа Longint в запись.
">Задание для самостоятельной работы.
">1. Написать программу для работы с файлами. При запуске программа должна выдавать главное меню с выбором команд.
- ">При выборе команды 1 происходит создание файла с расширением " xml:lang="en-US" lang="en-US">txt "> и добавление в файл определенного количества строк.
- ">При выборе команды 2 происходит удаление файла.
- ">При выборе команды 3 на экран консоли происходит вывод содержимого из файла, а так же при необходимости происходит добавление информации в файл.
- ">При выборе команды 4 на экран выводится дата и время создания файла.
- ">При выборе команды 5 происходит вывод атрибутов файла.
- ">При выборе команды 6 программа завершает свою работу.
">2. Написать программу-таймер. В программе необходимо реализовать несколько режимов работы таймера.
- ">При выборе команды 1 отображается режим таймера для отсчета до Нового года.
- ">При выборе 1 отображается полное количество месяцев, дней, часов, минут и секунд, оставшихся до Нового года.
- ">При выборе 2 отображается количество дней, оставшихся до Нового года.
- ">При выборе 3 отображается количество часов, оставшихся до Нового года.
- ">При выборе 4 отображается количество минут, оставшихся до Нового года.
- "> При выборе 5 отображается количество месяцев, оставшихся до Нового года.
- ">При выборе 6 отображается количество секунд, оставшихся до Нового года.
- ">При выборе команды 2 отображается оставшееся время до окончания учебной практики. Учебная практика заканчивается 26 декабря в 13:15.
- ">При выборе команды 3 отображается оставшееся до конца пары время. Программа должна автоматически определять, какая пара сейчас идет, и выводить оставшееся до звонка время. Если в момент запуска программы идет перемена, то программа должна вывести соответствующее сообщение. Если текущее время до 8:30, то программа выдает сообщение о том, что учебный день еще не начался. Если текущее время больше 13:15, то необходим вывод сообщения, что первая смена уже закончена.
- ">При выборе команды 4 программа прекращает работу. Необходимо реализовать программу таким образом, что выход из программы может осуществляться только выбором команды 4.
">Индивидуальное задание:
">Добавить пятый пункт в главное меню. При выборе пункта 5 программа начинает отсчитывать время до Вашего дня рождения.
">3. Добавить к программе 1 навигацию посредством стрелок. Пункты меню должны выбираться перемещением стрелок. Подтверждение выбора осуществляется клавишей
" xml:lang="en-US" lang="en-US">
Модули.
Описание модулей.
В Паскале под модулем понимают чаще всего подразумевают комплекс подпрограмм, который находится в отдельном файле и может быть использован другими программами.
Модуль состоит из заголовка, интерфейсной части , исполнительной части и секции инициализации .
Заголовок модуля похож на заголовок программы, однако вместо слова program ставится зарезервированное слово unit.
Модуль должен находится в файле, имя которого совпадает с именем в заголовке, файл должен иметь расширение .pas .
Интерфейсная часть служит для взаимодействия основной программы с модулем. Она начинается с зарезервированного слова interface. В ней должны быть указаны константы, типы данных, переменные, процедуры и функции, которые может использовать основная программа, вызывающая этот модуль. Если модуль использует еще какие-то модули, то они должны быть указаны в интерфейсной части следующим образом: пишется зарезервированное слово uses, затем перечисляются необходимые модули (заметим, что так же обозначаются и модули в разделе описания основной программы). Цепочка используемых модулей может быть сколь угодно длинной, однако она не может содержать циклы. Например, допустима цепочка:
А цепочка
недопустима, поскольку она содержит цикл A uses B uses A.
Процедуры и функции тоже объявляются в интерфейсной части модуля, но при этом разрешено лишь перечислять их заголовки, подобно предварительному объявлению с директивой forward.
В исполнительной части модуля содержаться процедуры и функции модуля. Здесь могут быть так же и локальные типы, константы, метки или переменные. Исполнительная часть начинается с зарезервированного слова implementation, далее следует описания локальных констант, типов данных и переменных, а затем обычное описание процедур и функций, но с использованием сокращенных заголовков, т.е. без указания в них параметров.
Иногда при вызове модуля следует произвести некоторые действия, например инициализировать какие-либо переменные, установить какие-либо связи и т.д. Все эти действия указываются в секции инициализации , которая выглядит, как обычное тело программы: между словами begin и end с точкой находятся операторы. Если при вызове модуля никаких подобных действий производить не нужно, то секция инициализации состоит лишь из слова end с точкой.
Чтобы использовать процедуры, функции и другие объекты модуля в основной программе, необходимо написать зарезервированное слово uses, затем имя модуля. После этого объекты модуля можно использовать так, как если бы они были описаны в основной программе.
Рассмотрим теперь модули, которые поставляются в стандартном комплексе Turbo Pascal, но функции и процедуры которых не являются стандартными.
Модуль CRT.
Модуль Crt содержит процедуры, функции и константы для работы с экраном в текстовом режиме, работы с клавиатурой и генерации звука.
Подпрограммы этого модуля позволяют управлять текстовыми режимами экрана, использованием цветов и окнами, яркостью свечения символов, а также расширенными кодами клавиатуры и звуком.
В текстовом режиме весь экран разбивается на строки (их, как правило, 25), а каждая строка - на отдельные позиции (их обычно по 80 в каждой строке) находится в левом верхнем углу экрана.
Модуль DOS.
Здесь собраны процедуры и функции (а также переменные и константы), позволяющие из программ получать доступ к средствам MS DOS и управлять файлами.
Модуль GRAPH.
Содержит множество подпрограмм, а также констант, типов и переменных, предназначенных для управления графическим режимом экрана. Ресурсы модуля позволяют обратится к любому пикселю экрана и управлять его свечением.
Запустить программу, использующую модуль GRAPH, без графического драйвера (одного или нескольких - это файла с расширением.BGI) не удастся. Указанные драйверы не входят в состав модуля, но поставляются с Turbo Pascal (они содержаться в каталоге BGI). А если в программе используются векторные шрифты, в дополнение е драйверам потребуются также файлы шрифтов (файлы с расширением.CHR).