Иванова Г.С. - Основы программирования
.pdf
|
6. Файловая система. Файлы |
|
|
||||
Begin |
|
|
|
|
|
|
|
ClrScr; |
|
|
|
|
|
|
|
WriteLnf'Введите имя |
файла:'); |
|
|
|
|||
ReadLn(name); |
|
|
|
|
|
|
|
Assign(fhname); |
|
|
|
|
|
|
|
{$!-} ReSet(ft);{$!+} |
{проверяем наличие файла с именем name} |
||||||
iflOResulto |
Othen |
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
WriteLn(#7, * нет файла с именем \namej; |
|
||||||
Halt; |
|
|
|
|
|
|
|
end; |
|
|
|
|
|
|
|
GeiFTime(fiyiime); |
{определяем дату создания файла} |
|
|||||
UnPackTifne(time,date); |
{распаковываем дату} |
|
|
||||
WriteLn(^ama |
создания файла= \date.year:5,date.month:3, |
date,day:3); |
|||||
WriteLnCВремя создания файла = \dateMour:3,date,min:3ydate.sec:3); |
|||||||
with date do |
|
|
|
|
|
|
|
begin year:=200J; |
month: =3; day: =8 |
end; |
|
||||
PackTime(date,tinte); |
{упаковываем дату} |
|
|
||||
SetFTime(fi,time); |
{меняем дату} |
|
|
||||
WriteLn(*Пocлe изменения даты: '); |
|
|
|||||
WriteLn('dama |
создания файла = |
\date,year:5,date,month:3,date.day:3); |
|||||
WriteLn(*вpeмя создания файла |
=\date.hour:3,date,min:3,date,sec:3); |
||||||
FSplit(nameypathf,namef,extJ); |
{расщепляем имя файла} |
||||||
WriteLn(*Пoлнoe имя |
файла |
=\pathf:25,namef:J2,extf:8); |
|
||||
GetFAttr(ft,k); |
{определяем атрибуты файла} |
|
|||||
atr:=lo(k); |
|
|
|
|
|
|
|
WriteLnC байт атрибутов \atr); |
|
|
|||||
size: =DiskFree(l); |
|
|
|
|
|
|
|
WriteLn(*Ceo6odHoe место на диске А \size:10, * байт |
'); |
||||||
Close(fi); |
|
|
|
|
|
|
|
End |
|
|
|
|
|
|
|
Результат работы программы: |
|
|
|
|
|||
Введите имя файла: |
|
|
|
|
|
||
c:\iva\primer.pas\file\primer.txt |
|
|
|
||||
Дата создания файла = 2001 3 7 |
|
|
|||||
Время создания файла = 10 47 22 |
|
|
|||||
После изменения даты |
|
|
|
|
|||
дата создания файла = 2001 |
3 8 |
|
|
||||
время создания файла = 10 47 22 |
|
|
|||||
Полное имя |
файла = |
c:\iva\primer.pas\file\ |
primer .txt |
||||
байт атрибутов 32 |
|
|
|
|
|
|
|
Свободное место на диске А |
|
9104 байт |
|
|
211
?• ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ДИНАМИЧЕСКОЙ ПАМЯТИ
До настоящего момента мы имели дело с переменными, которые размещаются в па мяти согласно вполне определенным правилам. Так, память под глобальные переменные программы выделяется в процессе компиляции, и эти переменные существуют в течение всего времени работы программы. Для локальных переменных, описанных в подпро грамме, память отводится при вызове подпрограммы, при выходе из нее эта память ос вобождается, а сами переменные прекращают свое существование. Иными словами, рас пределение памяти во всех случаях осуществляется полностью автоматически. Перемен ные, память под которые выделяется описанным образом, называют статическими. Под эту категорию подпадают все переменные, объявленные в области описаний программ ных блоков. Однако Borland Pascal предоставляет возможность создавать новые перемен ные во время работы программы, сообразуясь с потребностями решаемой задачи, и унич тожать их, когда надобность в них отпадает.
Переменные, созданием и уничтожением которых может явно управлять програм мист, называют динамическими. Для более полного понимания механизма работы с дина мическими переменными следует сначала разобраться в механизме адресации оператив ной памяти MS DOS.
7.1. Указатели и операции над ними
Наименьшей адресуемой единицей памяти персонального компьютера, построенного на базе микропроцессоров фирмы Intel и их аналогов, являет ся байт. Таким образом, память представляет собой последовательность ну мерованных байтов. Для обращения к конкретному байту необходимо знать его номер, который называют его физическим адресом.
Память принято делить на слова, двойные слова и параграфы. Слово имеет длину 2 байта, двойное слово ~ 4 байта, а параграф - 16 байт.
При работе с памятью используется адресация по схеме «база + смеще ние» (рис. 7.1). При этом адрес конкретного байта М определяется как адрес некоторого заданного байта А5 (адрес базы) + расстояние до требуемого бай та AQ^ (смещение),
212
7. Программирование |
с использованием динамической памяти |
|
В микропроцессорах |
фирмы Intel |
|
(начиная с i8086) в качестве адреса базы |
0 1 2 3 4 5 |
|
используют адреса, кратные 16. Четыре |
||
последних бита такого адреса равны О, и |
М |
|
их не хранят, а аппаратно добавляют при |
|
|
вычислении физического адреса. |
Рис. 7.1. Адресация по схеме |
|
Непрерывный участок памяти, име |
«База + смещение» |
|
ющий длину не более 64 КБ и начинаю |
|
щийся с адреса, кратного 16 (0,16,32, ), называют сегментом. Адрес нача ла сегмента принимают за базу для всего сегмента. Адрес базы сегмента без последних четырех бит называют сегментным.
Сегментный адрес и смещение имеют размер по 16 бит (слово). Физи ческий адрес, получаемый при их сложении с учетом отброшенных четырех бит (рис. 7.2), имеет размер 20 бит и может адресовать память объемом 2^^ байт или 1 МБ.
Максимальное смещение равно 2^^-1, что соответствует 64 КБ памяти. Таким образом, относительно одной базы можно адресовать не более 64 КБ памяти, что ограничивает размер сегмента.
Примечание. Современные модели микропроцессоров используют адреса большей дли ны с отличающейся схемой получения физического адреса, что учитывается версиями Pascal, предназначенным для работы «под Windows», но принцип адресации по схеме «база+смещение» используется и там.
Программа и данные хранятся в памяти фрагментами, каждый из кото рых расположен в своем сегменте. Различают три вида сегментов: кодов, данных и стека. В сегментах кодов хранится собственно программа. В сег ментах данных размещаются глобальные переменные и константы. Сегмент стека интенсивно используется в процессе выполнения программы: при вы зове подпрограмм в стек записывается адрес возврата, в нем размещаются локальные переменные, копии параметров-значений, адреса параметров-пе ременных и параметров-констант и т.п. (см. фрейм активации в парагра фе 5.6).
В процессе работы сегментные адреса хранятся в специальных сегмент
ных регистрах:
16 бит
CS - адрес базы сегмента кодов; |
Сегментный адрес |
0000 |
DS - адрес базы сегмента данных; + |
Смещение |
|
SS - адрес базы сегмента стека.
Доступ к конкретным участ кам сегмента осуществляется через
Физический адрес
20 бит
соответствующие смещения. |
Рис. 7.2. Получение физического адреса |
213