| {Содержимое массивов представлено строкой длины 11*3=33 }

PROCEDURE Save.St;

| BEGIN

| Assign( ff, 'DIMFILE.DAT' ); Rewrite( ff, 3 );

| BlockWrite( ff, St[1], 11 ); Close( ff )

| END;

PROCEDURE Load.St;

| BEGIN

| Assign( ff, 'DIMFILE.DAT' ); Reset(ff, 3);

| BlockRead( ff, St[1], 11 ); Close( ff )

| END;

| BEGIN

| WriteLn( 'Стартовое содержимое файла: ', St );

| Save St;

| Assign( f, 'DIMFILE.DAT' ); { связывание f с диском }

| Reset( f ); { открытие файла f }

| FS := FileSize( f ); { запоминание длины файла }

| if FS < 2 then

| begin

| WriteLn('Маловато записей в файле для примера!');

| Halt { выход из программы }

| end; {if}

| Read( f, Dfirst ); { считывается первый массив в файле }

| Seek( f, FS-1 ); { переход к последней записи }

| Read( f, Dlast ); {считывается последний массив }

| Seek( f, FilePos(f)-1 ); { назад на одну запись }

| Write( f, Dfirst ); { первый массив замещает последний }

| Seek{ f, 0 ); { переход в самое начало файла }

| Write( f, Dlast ); { последний массив замещает первый }

| Close( f ); { закрытие модифицированного файла }

| Load St; WriteLn { 'Итоговое содержимое файла: ', St );

| ReadLn { пауза до нажатия клавиши ввода }

| END.

Рис. 12.9

- 259 -

Напомним, что процедуры Write/Read и BlockWrite/BlockRead при каждом вызове перемещают границу на число прочитанных или записанных записей (компонентов или блоков).

Вызов Seek со значением N, большим чем FileSize, вызовет ошибку ввода-вывода.

<p>12.9.3. Усечение файлов</p>

Процедура Truncate(VAR f) связана с прямым доступом в файлы, но с натяжкой. Просто она увязана с процедурой позиционирования Seek.

Назначение процедуры Truncate - «отсекать хвосты» открытого файла f. Вернемся к рис. 12.8. Если текущая позиция соответствует, например, границе 2, то вызовом  Truncate(f) будут удалены все идущие за ней записи с реальными номерами 3, 4, ... , FileSize(f), а сама граница 2 станет концевой.

Комбинация

Seek(f,0);  {установить в начало файла}

Truncate(f); {отсечь все за границей 0}

сделает файл f совершенно пустым. Граница 0 станет первой и последней.

После отсечения нельзя восстановить прежнюю длину (если только не создать все заново). Можно трактовать  Truncate как частичное стирание (Erase). С текстовыми файлами процедура  Truncate не работает.

Несколько слов о работе EOF(f) — функция анализа конца файла f. Как только текущая позиция совпадает с концевой границей (см. рис. 12.5), функция EOF(f) начинает возвращать при опросе значение True. Все остальное время она возвращает значение False.

<p>12.10. Процедуры для работы с каталогами</p>

Поскольку Турбо Паскаль ориентирован на работу в среде MS-DOS, естественно, что он содержит средства, специфичные именно для этой ОС. В частности, в системной библиотеке имеются процедуры для работы с каталогами на дисках. Эти процедуры (табл. 12.5 ) практически повторяют набор средств самой MS-DOS.

- 260 -

Таблица 12.5

Процедура

Назначение

GetDir(drive : Byte; VAR S : String)

Возвращает в строке S текущее имя каталога на диске с индексом drive

ChDir(S : String)

Устанавливает текущим каталог с именем, содержащимся в S

MkDir(S : String)

Создает каталог с именем S на диске

RmDir(S : String)

Удаляет пустой каталог с именем S с диска

Для работы с каталогами Турбо Паскаль использует вызовы функций MS-DOS, а они очень чувствительны ко входным значениям имен каталогов и (или) дисков. Поэтому при невозможности выполнения процедуры возникает ошибка времени счета, и программа аварийно останавливается. Этого, однако, не случится, если вызов процедуры будет откомпилирован в режиме {$I-} — программа не будет обрываться. Подробнее об этом см. в разд. 12.11 «Обработка ошибок ввода-вывода» (команды управления каталогами определены как часть библиотеки ввода-вывода).

Перейти на страницу:

Поиск

Похожие книги