Пример 8. Реализовать процедуру, вставляющую в начало заданного текстового файла пустую строку.

Входные данные:

FT — изменяемый файл;

Текст процедуры:

{

Добавление пустой строки в начало текстового

файла - стандартная версия

Входные данные:

FT - изменяемый файл, должен быть связан

с именем существующего файла до вызова

процедуры.

}

procedure s41(var FT: Text);

var

FTemp: Text;

S: string;

begin

{ Связывание файловой переменной для временного файла }

{ Аналогичное связывание для FT выполнено вне процедуры }

Assign(FTemp, 'temp. tmp');

{ Открытие исходного файла на чтение }

Reset(FT);

{ Открытие временного файла на запись }

Rewrite(FTemp);

{ Копирование исходного файла во временный с изменениями }

WriteLn(FTemp); { изменения: добавление пустой строки }

while not EOF(FT) do { дальше копирование без изменений }

begin

ReadLn(FT, S);

WriteLn(FTemp, S)

end;

{ Открытие временного файла на чтение }

Reset(FTemp);

{ Открытие исходного файла на запись }

Rewrite(FT);

{ Копирование временного файла во исходный }

while not EOF(FTemp) do

begin

ReadLn(FTemp, S);

WriteLn(FT, S)

end;

{ Закрытие входного файла }

Close(FT);

{ Усечение размера временного файла до 0 }

Rewrite(FTemp);

{ Закрытие временного файла }

Close(FTemp)

end;

Замечания:

1) Данный пример демонстрирует правила использования файловых переменных в качестве параметров процедур и функций. Во-первых, они всегда передаются по ссылке. Во-вторых, внутри подпрограмм происходит связывание файловых переменных при помощи процедуры Assign только для переменных, объявленных локально. В большинстве случаев связывать файловую переменную-параметр подпрограммы внутри самой подпрограммы не имеет смысла и снижает её универсальность.

НЕ нашли? Не то? Что вы ищете?

2) Недостатком данного подхода является то, что временный файл остаётся на диске после завершения процедуры. Отчасти он компенсируется тем, что по окончании процедуры его длина устанавливается в 0 при помощи вызова процедуры Rewrite перед Close.

В некоторых реализациях языка Паскаль (Borland Turbo Pascal и т. д.) существуют дополнительные процедуры и функции для управления файлами: удаления, переименования и т. д. Например, для того чтобы удалить временный файл после завершения работы с ним, можно в конце процедуры s41 (обязательно после закрытия временного файла) добавить следующий оператор:

Erase(FTemp)

Чтобы воспользоваться процедурой переименования файлов, в примере 8 необходимо изменить процедуру s41 таким образом, чтобы она принимала в качестве параметра строку с именем обрабатываемого файла вместо файловой переменной.

Пример 9. Реализовать процедуру, вставляющую в начало заданного текстового файла пустую строку (с использованием расширений языка Паскаль для управления файлами).

Входные данные:

ST — имя изменяемого файла (строка);

Текст процедуры:

{

Добавление пустой строки в начало текстового

файла - версия, использующая расширения языка

для управления файлами

Входные данные:

ST - имя изменяемого файла, сам файл не должен

быть открыт до вызова процедуры.

}

procedure s42(ST: string);

var

FT, FTemp: Text;

S: string;

begin

{ Связывание файловой переменной для основного файла }

Assign(FT, ST);

{ Связывание файловой переменной для временного файла }

Assign(FTemp, 'temp. tmp');

{ Открытие исходного файла на чтение }

Reset(FT);

{ Открытие временного файла на запись }

Rewrite(FTemp);

{ Копирование исходного файла во временный с изменениями }

{ В этой части нет никаких отличий от процедуры s41 }

WriteLn(FTemp);

while not EOF(FT) do

begin

ReadLn(FT, S);

WriteLn(FTemp, S)

end;

{ Закрытие основного файла }

Close(FT);

{ Удаление основного файла }

Erase(FT);

{ Закрытие временного файла }

Close(FTemp);

{ Переименование временного файла в имя основного }

Rename(FTemp, ST)

end;

2.4  Ввод/вывод числовой информации в текстовые файлы

Точно так же, как и в случае с файлами Input и Output, можно организовать ввод/вывод числовых данных из/в любых других текстовых файлов.

Пример 10. Дан текстовый файл, содержащий последовательность вещественных чисел. Необходимо записать в другой текстовый файл все числа из него, бóльшие их среднего арифметического.

Входные данные:

Последовательность вещественных чисел в текстовом файле с именем “input. txt”.

Выходные денные:

Последовательность вещественных чисел в текстовом файле с именем “output. txt”.

Оба файла расположены в каталоге программы.

Текст программы:

{

Запись в текстовый файл всех чисел из другого

текстового файла, больших их среднего арифметического

}

program s_5_1;

var

FIn, FOut: Text;

R, RAv: Real;

NCount: Integer;

begin

{ Открытие входного файла }

Assign(FIn, 'input. txt');

Reset(FIn);

{ Нахождение среднего арифметического }

NCount := 0;

RAv := 0.0;

while not EOF(FIn) do

begin

Read(FIn, R);

NCount := NCount + 1;

RAv := RAv + R

end;

if NCount > 0 then

RAv := RAv / NCount;

{ Открытие выходного файла }

Assign(FOut, 'output. txt');

Rewrite(FOut);

{ Возврат на начало входного файла }

Reset(FIn);

{ Запись в выходной файл всех чисел, больших RAv }

while not EOF(FIn) do

begin

Read(FIn, R);

if R > RAv then

Write(FOut, ' ', R)

end;

{ Закрытие файлов }

Close(FIn);

Close(FOut)

end.

При работе с текстовыми файлами необходимо учитывать, что фактически (в отличие от типизированных файлов) в них не содержится никакой числовой информации. Просто при (например) записи в текстовый файл целого или вещественного числа оно преобразуется в последовательность символов, выглядящих, как его десятичное представление.

Упражнения

1) Почему в программе s_5_1 из примера 10 при записи в файл очередного вещественного числа перед ним записывается пробел? Что будет, если эти пробелы не записывать перед каждым числом?

2) Почему в программе s_5_1 пробел записывается перед числом, а не после него?

Пример 11. Дано натуральное n и последовательность из n целых неотрицательных чисел, хранящаяся в массиве. Реализовать процедуру WriteDiagramLR(N, VA, VFText), записывающую в текстовый файл VFText графическое представление последовательности (передаваемой через параметр-массив VA) в виде столбиковой диаграммы, ориентированной слева направо, с подписями значений последовательности, расположенными слева от столбиков.

Пример: для последовательности:

3, 5, 7, 4, 8, 4, 6, 1, 5, 0

(n = 10) в текстовый файл необходимо записать следующую информацию:

3 XXX

5 XXXXX

7 XXXXXXX

4 XXXX

8 XXXXXXXX

4 XXXX

6 XXXXXX

1 X

5 XXXXX

0

Входные данные:

Натуральное число N и последовательность из N целых неотрицательных чисел, хранящаяся в первых N элементах массива VA.

Выходные денные:

Последовательность строк, выводимая в текстовый файл VFText.

Текст процедуры:

{

Запись в текстовый файл последовательности целых

неотрицательных чисел в виде столбиковой диаграммы,

ориентированной слева направо.

Входные данные:

N - размер последовательности;

VA - последовательность;

VFText - текстовый файл.

}

procedure WriteDiagramLR(

N: Integer; var VA: TVector;

var VFText: Text);

var

I, J: Integer;

begin

{ Открытие выходного файла }

Rewrite(VFText);

{ Запись пустой строки }

WriteLn(VFText);

{ Запись остальных строк }

if N > 0 then { последовательность не пуста }

begin

for I := 1 to N do { для каждого числа послед-сти }

begin

{ Запись пробела, текстового представления }

{ числа в поле из 3 позиций и пробела }

Write(VFText, ' ', VA[I] : 3, ' ');

{ Запись нужного количества 'X' }

for J := 1 to VA[I] do

Write(VFText, 'X');

{ Запись перевода строки }

WriteLn(VFText)

end { for I := 1 to N do }

end; { if N > 0 }

{ Запись пустой строки }

WriteLn(VFText);

{ Закрытие выходного файла }

Close(VFText)

end; { WriteDiagramLR }

3  Задачи

1)  Дан текстовый файл. Необходимо переписать его содержимое в другой текстовый файл, добавляя в начало каждой строки её порядковый номер (десятичную запись целого числа шириной в 5 символов, выровненную по правой границе поля) и пробел.

2)  Дан текстовый файл. Необходимо переписать в другой текстовый файл все его непустые строки, которые начинаются и оканчиваются одинаковым символом.

3)  Дан текстовый файл. Необходимо переписать в другой текстовый файл его содержимое, кроме непустых строк, начинающихся с точки.

4)  Дан текстовый файл. Найти количество пустых строк в нём.

5)  Дан текстовый файл. Найти длину его максимальной строки.

6)  Дан текстовый файл. Найти количество строк в нём, начинающихся с заданного символа.

7)  Дан текстовый файл. Найти количество строк в нём, оканчивающихся заданным символом.

8)  Дан текстовый файл. Найти количество строк в нём, состоящих из одинаковых символов.

9)  Дан текстовый файл. Удалить в нём все строки максимальной длины.

10)  Дан текстовый файл. Переписать его содержимое (кроме символов перевода строки) в другой текстовый файл, вставляя символы перевода строки после каждой точки, а также через 40 символов после предыдущего перевода строки.

11)  Дан текстовый файл. Переписать его содержимое в другой текстовый файл, дополняя справа все его строки, меньшие по длине 80 символов, пробелами справа до 80 символов.

12)  Дана последовательность символов, заканчивающаяся точкой и вводимая пользователем с клавиатуры. Необходимо записать её в текстовый файл, вставляя в неё символы перевода строки через каждые 40 символов.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5