Пример 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 |


