Программирование в среде Delphi
Часть III
Файлы
3.1 Диалоговые окна
Для работы с файлами в Delphi можно использовать диалоговые окна. Рассмотрим свойства некоторых компонентов, с помощью которых в Delphi реализуются диалоговые окна.
Диалоговое окно выбора имени открываемого файла OpenDialog предназначено для просмотра файловой системы компьютера и выбора имени требуемого файла. Компонент OpenDialog не предназначен для автоматического открытия файлов. Он позволяет лишь получить имя выбранного пользователем файла. Непосредственное открытие файла осуществляется при помощи стандартных процедур языка Object Pascal либо специальных методов, определённых, например, в классе TStrings.
Рассмотрим основные свойства класса TOpenDialog, экземпляром которого является компонент OpenDialog.
property DefaultExt : string;
Содержит расширение, добавляемое к имени файла, если у него не указано расширение.
property FileName : string;
Содержит имя выбранного файла.
property Files : TStrings;
Содержит список имён выделенных файлов.
property Filter : string;
Содержит описание одного или нескольких файловых фильтров. Например, фильтр * . pas поможет пользователю отображать в диалоговом окне только файлы, имеющие расширение. pas.
property InitialDir : string;
Определяет папку, содержимое которой появляется при открытии диалогового окна.
function Execute : boolean;
Размещает диалоговое окно на экране в модальном режиме. Модальный режим означает, что выполнение приложения приостанавливается до тех пор, пока пользователь не закроет модальное окно. Функция возвращает значение true, если окно закрыто кнопкой Открыть, и false, если закрыто кнопкой Отмена.
Диалоговое окно SaveDialog очень похоже на окно OpenDialog, но в отличие от него используется при сохранении файла.
Диалоговое окно FontDialog позволяет пользователю выбирать шрифт и устанавливать его характеристики. Основным свойством компонента FontDialog является свойство Font, задающее характеристики шрифта.
Пример использования компонентов OpenDialog, SaveDialog и FontDialog.
Создадим простой текстовый редактор, который позволил бы с помощью диалоговых окон открывать и сохранять текстовые файлы, а также изменять характеристики шрифта.
Разместим на форме следующие компоненты OpenDialog1, SaveDialog1, FontDialog1 выберем из страницы Dialogs, Memo1, Button1, Button2, Button3 – из страницы Standard.
Выберем свойство Filter компонента OpenDialog1 и щёлкнем по появившейся кнопке с тремя точками. Появится диалоговое окно Filter Editor, с помощью которого можно задать фильтры.
Filter Name | Filter |
Текстовые файлы (*.txt, *.doc) | *.txt; *.doc |
Все файлы (*.*) | *.* |
После заполнения нажать кнопку Ok.
Для компонента SaveDialog значение свойства DefaultExt установим равным txt. т. е., если при сохранении файла расширение не будет указано, то по умолчанию добавится расширение txt.
Кнопкам Button1, Button2, Button3 установим свойство Caption равным ¢Открыть¢, ¢Сохранить¢, ¢Шрифт¢.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
FontDialog1: TFontDialog;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if not opendialog1.execute then exit;
memo1.Lines. LoadFromFile(OpenDialog1.filename)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not savedialog1.execute then exit;
memo1.Lines. SaveToFile(savedialog1.filename)
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if not fontdialog1.execute then exit;
memo1.Font:=fontdialog1.font
end;
end.
3.2 Файловые типы и файловые переменные
Object Pascal располагает средствами создания и обработки файлов различных типов. Доступ к файлу осуществляется с помощью переменных файлового типа. В Object Pascal существует три файловых типа:
TextFile – текстовый файл, представляющий собой набор символьных строк переменной длины;
File of < тип > – типизированный файл, представляющий собой набор данных указанного типа;
File – нетипизированный файл, представляющий собой набор неструктурированных данных.
Примеры описания файловых переменных:
var f1: textfile; f2: file of integer; f3: file of char; f4: file;
Здесь f1 – текстовый файл, f2 и f3 – типизированные файлы, f4 – нетипизированный файл.
3.3 Стандартные подпрограммы для доступа к файлам.
Работа с файлами заключается в записи и считывании информации. Для того чтобы указать, с каким элементом будет производиться очередная операция чтения или записи, существует понятие указателя на доступный элемент файла. После каждого чтения или записи указатель перемещается на следующий элемент файла.
Перед использованием файловой переменной она должна быть связана с внешним файлом ( файлом на диске) с помощью вызова процедуры
AssignFile(< файловая переменная>, < имя файла>);
здесь <файловая переменная> – имя переменной файлового типа, объявленной в программе; <имя файла> – символьная строка, содержащая имя файла. Если файл находится в одной папке с обрабатывающей его программой, то достаточно указать только имя файла, в противном случае надо указать полный путь к файлу, например:
¢c:\files\z1.txt¢
Когда связь с внешним файлом установлена, его можно открыть для ввода или вывода информации. Существующий файл можно открыть с помощью процедуры
Reset(<файловая переменная>);
Процедура reset открывает существующий внешний файл, имя которого было связано с файловой переменной. Если внешний файл с указанным именем отсутствует, то возникает ошибка периода выполнения программы. Если файл уже открыт, то он сначала закрывается, а затем открывается вновь. Файловый указатель устанавливается на элемент файла с порядковым номером 0.
Текстовый файл, открытый процедурой reset, доступен только для чтения. Для типизированных и нетипизированных файлов, открытых процедурой reset, допускается выполнять операции чтения и записи в файл.
Новый файл можно создать и открыть для записи с помощью процедуры
Rewrite(<файловая переменная>);
Процедура rewrite создаёт новый файл, имя которого связано с файловой переменной. Если файл с указанным именем уже существует, то он удаляется и на его месте создаётся новый пустой файл. Текущая позиция в файле устанавливается на начало файла, т. е. указатель будет указывать на элемент с порядковым номером 0.
Если процедура rewrite открывает текстовый файл, то он становится доступным только для записи. Для типизированных и нетипизированных файлов, открытых процедурой rewrite, допускается выполнять операции чтения и записи в файл.
Текстовый файл может быть открыт процедурой
Append(<файловая переменная>);
Процедура append открывает уже существующий внешний файл, связанный с файловой переменной, для добавления новой информации. Если файла с указанным именем не существует, то возникает ошибка. Если файл уже открыт, то он сначала закрывается, а затем открывается заново. Указатель будет указывать на конец файла. В результате обращения к append текстовый файл становится доступным только для записи.
Когда программа завершает обработку файла, он должен быть закрыт с помощью стандартной процедуры
CloseFile(<файловая переменная>);
Процедура closefile закрывает открытый файл. При этом обеспечивается сохранение в файле всех новых записей и регистрация файла в папке. Процедура closefile не разрывает связь файла с файловой переменной, поэтому файл можно открыть снова без повторного использования процедуры assignfile.
3.4 Текстовые файлы
Текстовый файл представляет собой последовательность символов, сгруппированных в строки произвольной длины, где каждая строка заканчивается маркером конца строки – EOLN (end of line), состоящим из двух символов: CR=#13 и LF=#10. Заканчивается файл символом конца файла EOF (end of file, код #26).
Чтение данных из произвольного текстового файла можно осуществить с помощью процедур read и readln. При этом в списке их параметров первой должна стоять соответствующая файловая переменная. Например, процедура read(f, x, y, z); осуществляет чтение из файла, связанного с файловой переменной f, значения переменных x, y, z. Процедура readln(f, a);
прочитает из файла, связанного с переменной f, значение переменной a и перейдёт в этом файле к следующей строке.
Вывод данных в текстовый файл производится процедурами write и writeln, у которых первой в списке параметров указана соответствующая файловая переменная. Например, процедура write(f, ¢ s = ¢, s) осуществляет запись в файл, связанный с переменной f, символьной строки ¢ s = ¢ и значения переменной s. Процедура writeln(f) запишет в файл, связанный с переменной f, пустую строку.
При работе с текстовыми файлами используются логические функции eof(<файловая переменная>) и eoln(<файловая переменная >). Функция eof возвращает значение true, если достигнут конец файла, и false в противном случае. Функция eoln возвращает значение true, если достигнут конец строки в текстовом файле, и false в противном случае.
Текстовый файл можно создать в среде Delphi, выбрав в меню команду FileNewText. В открывшемся окне нужно набрать содержимое текстового файла и сохранить файл с помощью команды FileSave. Текстовый файл можно также создать программным способом. Рассмотрим несколько возможных вариантов программы для создания текстового файла.
Задача 1. Создать текстовый файл и заполнить его информацией, введённой в редакторе Memo. Окно работающего приложения:

Создание текстового файла с использованием метода SaveToFile:
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines. SaveToFile('c:\Files\z1.txt');
end;
Создание текстового файла без использования метода SaveToFile:
procedure TForm1.Button1Click(Sender: TObject);
var f : textfile; n, i : integer;
begin
assignfile(f, 'c:\Files\z1.txt');
rewrite(f);
n:=memo1.Lines. Count;
for i:=1 to n do writeln(f, memo1.lines. strings[i-1]);
closefile(f);
end;
Приведённый здесь текст программы содержит имя создаваемого файла (c:\Files\z1.txt) . Поэтому, чтобы создать другой файл, нужно будет внести изменения в текст программы. Добавив на форму компонент SaveDialog, мы получим удобное средство для выбора имени создаваемого файла на этапе работы приложения. Окно приложения после добавления компонента SaveDialog:

Преобразованная процедура Button1Click:
procedure TForm1.Button1Click(Sender: TObject);
var f : textfile; n, i :integer;
begin
if not savedialog1.Execute then exit;
assignfile(f, savedialog1.filename);
rewrite(f);
n:=memo1.Lines. Count;
for i:=1 to n do
writeln(f, memo1.lines. strings[i-1]);
closefile(f);
end;
Задача 2. Вычислить количество строк из четырёх символов данного текстового файла. Для выбора имени файла использовать компонент OpenDialog. Выбранный файл отобразить в окне Memo. Окно приложения:

procedure TForm1.Button1Click(Sender: TObject);
var f : textfile; s : string; k : byte;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
memo1.Lines. LoadFromFile(opendialog1.FileName);
reset(f);
k:=0;
while not eof(f) do
begin
readln(f, s); if length(s)=4 then inc(k);
end;
closefile(f);
label1.Caption:='Ответ ' + inttostr(k)
end;
Задача 3. Показать строки файла, начинающиеся с буквы ²ф². Для выбора имени файла использовать компонент OpenDialog. Для отображения в форме нужных строк файла использовать компонент Memo. Окно работающего приложения:

procedure TForm1.Button1Click(Sender: TObject);
var f : textfile; s : string;
begin
if not opendialog1.execute then exit;
assignfile(f, opendialog1.filename);
reset(f);
while not eof(f) do
begin
readln(f, s); if s[1]='ф' then memo1.Lines. Add(s);
end;
closefile(f);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Lines. Clear;
end;
Задачи для самостоятельной работы.
Задача 4. Подсчитать число строк файла, заканчивающихся русской буквой ²а². Для выбора имени файла использовать компонент OpenDialog. Выбранный файл отобразить в окне Memo. Окно работающего приложения:

Задача 5. Показать все строки файла, начинающиеся и заканчивающиеся одним и тем же символом. Для выбора имени файла использовать компонент OpenDialog. Для отображения нужных строк файла в форме использовать компонент Memo. Окно работающего приложения:

Задача 6. Переписать в новый файл все строки исходного текстового файла, содержащие русскую букву ²т², добавляя в конец строки символ ²;² . Для выбора имён исходного и создаваемого файла использовать диалоговые окна. Окно работающего приложения:

В этом приложении имена файлов, выбранные в окне OpenDialog1 и SaveDialog1, отображаются на форме в поле меток Label1 и Label2.
type TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Memo2: TMemo;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var f, f1 : textfile; s:string;
begin
if not opendialog1.execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=opendialog1.FileName;
memo1.Lines. LoadFromFile(opendialog1.FileName);
if not savedialog1.execute then exit;
assignfile(f1, savedialog1.filename);
label2.Caption:=savedialog1.filename;
reset(f); rewrite(f1);
while not eof(f) do
begin readln(f, s); if pos(' т ', s) <>0 then writeln(f1, s, ' ; ') end;
closefile(f); closefile(f1);
memo2.Lines. LoadFromFile(savedialog1.FileName);
end;
end.
Задача 7. Дополнить новыми строками уже существующий текстовый файл. Для выбора имени файла использовать компонент OpenDialog. Окно работающего приложения:

Задача 8. Найти количество строк данного текстового файла и добавить к данному файлу строку, содержащую надпись ²Количество строк файла равно ² и найденное число. Для выбора имени файла использовать компонент OpenDialog. Окно работающего приложения:

Задача 9. В начало каждой строки файла вставить её номер и записать преобразованные строки в новый файл. Для выбора имён исходного и создаваемого файла использовать диалоговые окна. Окно работающего приложения:

Задача 10*. Дан текстовый файл, содержащий строки. Переписать содержимое файла в другой файл, сдвигая циклически каждую строку вправо на 3 символа. Например, результатом сдвига строки abcdewrt будет строка wrtabcde. Для выбора имён исходного и создаваемого файла использовать диалоговые окна. Окно работающего приложения:

Задача 11*. Дан текстовый файл, содержащий строки. Исключить из файла слова begin и end. Окно работающего приложения:

Задача 12. Дан текстовый файл, содержащий строки. Переписать в другой файл все строки данного файла, заменяя в каждой строке символ ¢ , ¢ на символ ¢ . ¢ Окно работающего приложения:

Задача 13. Дан текстовый файл, содержащий строки. Переписать в другой файл все строки данного файла в перевёрнутом виде. Окно работающего приложения:

Задача 14. Дан текстовый файл, содержащий строки. Выяснить, имеется ли в нём строка, начинающаяся с буквы ¢w¢. Если да, то определить номер первой из таких строк. Окно работающего приложения:

Задача 15. Дан текстовый файл, содержащий строки. Найти максимальную длину строки в данном файле. Показать самую длинную строку файла. Если таких строк несколько, то показать первую из них. Окно работающего приложения:

Задача 16*. Дан текстовый файл, содержащий строки. Будем считать, что длина строк не превышает 30 символов. Преобразовать файл так, чтобы все строки были отцентрированы: строки, содержащие менее 30 символов, дополняются символами знак подчёркивания ¢_¢ , текст строки размещается по центру поля размером 30 символов. Окно работающего приложения:

Задача 17. Дан текстовый файл, содержащий целые числа. Найти количество чисел в файле. Окно работающего приложения:

procedure TForm1.Button1Click(Sender: TObject);
var f : textfile; k, m : integer;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=Opendialog1.FileName;
memo1.Lines. LoadFromFile(opendialog1.FileName);
reset(f); k:=0;
while not eof(f) do
begin
read(f, m); inc(k)
end;
closefile(f);
label2.Caption:='Количество чисел в файле равно ' + inttostr(k);
end;
Задача 18. Дан текстовый файл, содержащий целые числа. Найти сумму чётных чисел файла. Окно работающего приложения:

Задача 19. Дан текстовый файл, содержащий целые числа. Найти среднее арифметическое чисел в файле. Окно работающего приложения:

Задача 20. Дан текстовый файл, содержащий целые числа. Найти сумму чисел в каждой строке файла. Найденные числа записать в новый текстовый файл по одному в строке. Окно работающего приложения:

procedure TForm1.Button1Click(Sender: TObject);
var f, f1 : textfile; s, m : integer;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=Opendialog1.FileName;
memo1.Lines. LoadFromFile(opendialog1.FileName);
if not savedialog1.Execute then exit;
assignfile(f1, savedialog1.FileName);
label2.Caption:=savedialog1.FileName;
reset(f); rewrite(f1);
while not eof(f) do
begin
s:=0;
while not eoln(f) do
begin read(f, m); s:=s + m end;
writeln(f1, s); readln(f)
end;
closefile(f); closefile(f1);
memo2.Lines. LoadFromFile(savedialog1.FileName);
end;
Задача 21. Дан текстовый файл, содержащий целые числа. Найти максимальное число в каждой строке файла. Найденные числа записать в новый текстовый файл по одному в строке. Окно работающего приложения:

Задача 22. Дан текстовый файл, содержащий строки. Создать новый текстовый файл, в каждой строке которого записать два числа: количество запятых и количество точек в соответствующей строке исходного файла. Окно работающего приложения:

Задача 23*. Дан текстовый файл, содержащий строки. Создать новый текстовый файл, в каждой строке которого записать все натуральные числа, встречающиеся в соответствующей строке исходного файла. Окно работающего приложения:

Задача 24*. Дан текстовый файл, в котором встречаются даты (например, 08.05.1672) . Найти в этом файле все октябрьские даты прошлого столетия (например, 07.10.1931). Записать эти даты в новый файл по одной в строке. Окно работающего приложения:

Задача 25. Дан текстовый файл, содержащий целые числа. Найти количество отрицательных чисел в каждой строке файла. Найденные числа записать в новый текстовый файл по одному в строке. Окно работающего приложения:

Задача 26. Дан текстовый файл, содержащий целые числа, количество которых кратно 3. Записать в новый текстовый файл все числа исходного файла по три числа в строке. Окно работающего приложения:

Задача 27. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. В каждой строке массива все элементы, меньшие первого элемента данной строки массива заменить нулями. Полученный массив записать в новый текстовый файл. Окно работающего приложения:

procedure TForm1.Button1Click(Sender: TObject);
var t, t1 : textfile; a : array of array of integer;
n, m, i, j : byte;
begin
if not opendialog1.Execute then exit;
assignfile(t, opendialog1.filename);
label1.Caption:=opendialog1.filename;
memo1.Lines. LoadFromFile(opendialog1.filename);
if not savedialog1.Execute then exit;
assignfile(t1, savedialog1.filename);
label2.Caption:=savedialog1.filename;
reset(t); rewrite(t1);
readln(t, n, m); setlength(a, n, m);
i:=0;
while not eof(t) do
begin j:=0;
while not eoln(t) do
begin read(t, a[i, j]); inc(j) end;
inc(i); readln(t)
end;
for i:=0 to n-1 do
for j:=0 to m-1 do
if a[i, j]<a[i,0] then a[i, j]:=0;
for i:=0 to n-1 do
begin
for j:=0 to m-1 do write(t1, a[i, j]:6);
writeln(t1)
end;
closefile(t); closefile(t1);
memo2.Lines. LoadFromFile(savedialog1.filename);
end;
Задача 28. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. В каждой строке массива найти максимальный элемент и поменять местами первый элемент строки и максимальный. Полученный массив записать в новый текстовый файл. Окно работающего приложения:

Задача 29. Дан текстовый файл, в первой строке которого записаны два числа n и m (m>n), а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. В каждой строке массива удалить элемент, номер которого равен номеру соответствующей строки. Полученный массив записать в новый текстовый файл. Окно работающего приложения:

Задача 30. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. В каждой строке массива удалить последний отрицательный элемент (считать, что в каждой строке есть отрицательный элемент). Полученный массив записать в новый текстовый файл. Окно работающего приложения:

Задача 31. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. Удалить из массива строку, содержащую максимальный элемент массива. (Считать, что такой элемент единственный). Полученный массив записать в новый текстовый файл. Окно работающего приложения:

Задача 32*. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – зашифрованный текст, записанный в прямоугольную таблицу символов размером n×m. Порядок следования символов (ключ к шифру) указан в другой таблице того же размера, в которой записаны целые числа от 1 до n×m. Расшифровать текст и результат записать в новый текстовый файл. Окно работающего приложения:

Задача 33*. Дан текстовый файл, в первой строке которого записаны два целых числа n и m, во второй строке – целое число r, а в следующих строках – зашифрованный текст, записанный в прямоугольную таблицу символов размером n×m. Чтобы расшифровать текст, нужно каждую строку матрицы сдвинуть циклически вправо на число позиций, равное номеру строки, а затем каждый нечетный столбец сдвинуть циклически вверх на заданное число позиций r. Расшифровать текст и результат записать в новый текстовый файл. Окно работающего приложения:

Задача 34. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. В каждой строке массива вставить число, равное i*100 ( i – номер строки), после третьего элемента. Полученный массив записать в новый текстовый файл. Окно работающего приложения:

Задача 35. Дан текстовый файл, в первой строке которого записаны два числа n и m, а в следующих строках – прямоугольная таблица целых чисел размером n×m. Заполнить целочисленный массив размером n×m числами из этой таблицы. Вставить в массив первую строку после третьей строки массива. Полученный массив записать в новый текстовый файл. Окно работающего приложения:

3.5 Типизированные файлы
Типизированный файл содержит элементы одного типа. Тип элементов может быть любым, кроме файлового. Создать и просмотреть такой файл при помощи текстового редактора как текстовый файл нельзя. Поэтому обработка таких файлов должна осуществляться программным путём. Напомним, что описание файловой переменной, соответствующей типизированному файлу имеет вид:
var <имя файловой переменной> : file of <тип>;
Для чтения данных из типизированного файла применяется процедура read. Список ввода процедуры read должен содержать переменные того же типа, что и элементы файла. Для записи в типизированный файл используется процедура write, список вывода которой должен содержать переменные того же типа, что и элементы файла. Процедуры readln и writeln для типизированных файлов не применяются.
Доступ к текстовым файлам возможен только последовательно, то есть, когда элемент считывается или записывается, указатель файла перемещается к следующему по порядку элементу файла. К типизированным файлам можно организовать прямой доступ с помощью стандартной процедуры
procedure seek( var f; n:longint);
которая перемещает файловый указатель в типизированном файле, связанном с файловой переменной f, на элемент с номером n. Нумерация элементов в файле начинается с нуля. Для определения текущей позиции в файле используется функция
function filepos( var f):longint;
Для определения размера файла используется функция
function filesize( var f):integer;
Например, для установки файлового указателя на последний элемент файла f достаточно записать
seek(f, filesize(f)–1);
на первый элемент файла
seek(f, 0);
вернуться на один элемент назад
seek(f, filepos(f)–1);
Применение процедур assignfile и closefile для типизированных файлов не отличается от текстовых файлов. Процедура reset, в отличие от текстовых файлов, допускает для типизированных файлов не только чтение, но и запись в файл. Процедура rewrite, в отличие от текстовых файлов, допускает не только запись, но и чтение из файла. Процедура append и функция eoln для типизированных файлов не работают.
Задача 36. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Вывести содержимое созданного файла в поле метки Label.

Создание типизированного файла символов:
procedure TForm1.Button1Click(Sender: TObject);
var f : file of char; i : integer;
begin
if not savedialog1.execute then exit;
label1.Caption:=savedialog1.FileName;
assignfile(f, savedialog1.FileName);
rewrite(f);
for i:=1 to length(edit1.Text) do write(f, edit1.text[i]);
closefile(f);
end;
Вывод содержимого типизированного файла в поле метки Label2:
procedure TForm1.Button2Click(Sender: TObject);
var f : file of char; d : char;
begin
if not opendialog1.execute then exit;
assignfile(f, opendialog1.FileName);
reset(f); label2.Caption:='';
while not eof(f) do
begin read(f, d); label2.caption:=label2.caption + d end;
closefile(f)
end;
Задача 37. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Добавить в конец файла символ ¢ ! ¢ .

var Form1: TForm1; f : file of char;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
if not savedialog1.execute then exit;
label1.Caption:=savedialog1.FileName;
assignfile(f, savedialog1.FileName);
rewrite(f);
for i:=1 to length(edit1.Text) do write(f, edit1.text[i]);
closefile(f);
end;
procedure TForm1.Button2Click(Sender: TObject);
var c:char;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=opendialog1.FileName;
reset(f);
c:='!'; seek(f, filesize(f)); write(f, c);
closefile(f)
end;
procedure TForm1.Button3Click(Sender: TObject);
var d:char;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
reset(f); label2.Caption:='';
while not eof(f) do
begin
read(f, d); label2.caption:=label2.caption + d
end;
closefile(f)
end;
Задача 38. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Заменить последний символ файла на символ ¢ * ¢ .

Задача 39. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Записать в новый типизированный файл все малые английские буквы исходного типизированного файла.

Процедура обработки события щелчка по кнопке Выполнить:
procedure TForm1.Button2Click(Sender: TObject);
var f, h : file of char; d : char; alp : string;
begin
alp:='abcdefghijklmnopqrstuvwxyz';
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=opendialog1.FileName;
if not savedialog1.Execute then exit;
assignfile(h, savedialog1.FileName);
label2.Caption:=savedialog1.FileName;
reset(f); rewrite(h);
while not eof(f) do
begin
read(f, d); if pos(d, alp) <> 0 then write(h, d)
end;
closefile(f); closefile(h)
end;
Задача 40. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Записать в новый типизированный файл все цифры из исходного типизированного файла.

Задача 41. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Заменить второй символ файла символом ¢ # ¢ . ( Не используя вспомогательный файл. )

Задача 42. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Переписать всё содержимое исходного типизированного файла кроме предпоследнего элемента в новый типизированный файл.

Задача 43. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Заменить в файле все цифры символом ¢ ? ¢ . ( Не используя вспомогательный файл. )

Задача 44. Добавить новый символ ¢ $ ¢ в начало существующего типизированного файла. ( Использовать вспомогательный файл. )

type fch = file of char;
var Form1: TForm1; f : fch;
implementation
{$R *.dfm}
procedure copy(var t1, t2 : fch);
var d : char;
begin
while not eof(t1) do
begin read(t1, d); write(t2, d) end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var c : char; h : fch;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=opendialog1.FileName;
assignfile(h, 'buf. dat');
reset(f); rewrite(h);
copy(f, h);
reset(f); c:='$'; write(f, c);
reset(h); copy(h, f);
closefile(f); closefile(h)
end;
procedure TForm1.Button2Click(Sender: TObject);
var d : char;
begin
reset(f); label2.Caption:='';
while not eof(f) do
begin
read(f, d);
label2.caption:=label2.caption + d
end;
closefile(f)
end;
Задача 45. Вставить новый символ ¢ + ¢ после четвёртого по порядку элемента существующего типизированного файла. ( Использовать вспомогательный файл. )

Задача 46. Удалить из существующего типизированного файла все символы ¢ , ¢ . ( Использовать вспомогательный файл.)

Задача 47. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Заменить в файле каждую английскую букву ¢ e ¢ буквой ¢ i ¢ . ( Не используя вспомогательный файл. )

Процедура обработки события щелчка по кнопке Выполнить:
procedure TForm1.Button2Click(Sender: TObject);
var f:file of char; c, d:char;
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=opendialog1.FileName;
reset(f); c:='i';
while not eof(f) do
begin
read(f, d);
if d='e' then begin seek(f, filepos(f)-1); write(f, c) end
end;
closefile(f)
end;
Задача 48. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Заменить в файле каждый пробел символом ¢ _ ¢ . ( Не используя вспомогательный файл. )

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

Задача 50*. Создать символьный файл, количество элементов которого чётно. Переписать содержимое данного символьного файла в новый символьный файл, изменяя порядок элементов следующим образом: 1ый символ поменять местами со 2ым, 3ий с 4ым и так далее.


Задача 51*. Переписать все элементы данного символьного файла в новый символьный файл в обратном порядке, не используя строковую переменную в качестве буфера.

Задача 52. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Переписать содержимое файла в новый символьный файл, изменяя порядок элементов следующим образом: сначала все знаки арифметических операций, встречающиеся в файле, а потом все остальные символы файла.

Процедура обработки события щелчка по кнопке Выполнить:
procedure TForm1.Button1Click(Sender: TObject);
var c, d:char; str:string[4];
begin
if not opendialog1.Execute then exit;
assignfile(f, opendialog1.FileName);
label1.Caption:=opendialog1.FileName;
if not savedialog1.Execute then exit;
assignfile(h, savedialog1.FileName);
label2.Caption:=savedialog1.FileName;
str:='+*-/';
reset(f); rewrite(h);
while not eof(f) do
begin
read(f, d); if pos(d, str)<>0 then write(h, d)
end;
seek(f, 0);
while not eof(f) do
begin
read(f, d); if pos(d, str)=0 then write(h, d)
end;
closefile(f); closefile(h)
end;
Задача 53. Создать типизированный файл, состоящий из символов, введённых в окно ввода Edit. Переписать содержимое файла в новый символьный файл, изменяя порядок элементов следующим образом: сначала все знаки препинания, встречающиеся в файле, а потом все остальные символы файла.

Задача 54. Создать типизированный файл, состоящий из целых чисел, введённых в столбик в окно текстового реактора Memo. Вывести содержимое созданного файла в поле метки Label.

type fint = file of integer;
var Form1: TForm1; f : fint;
implementation
{$R *.dfm}
Процедура обработки события щелчка по кнопке Создать файл:
procedure TForm1.Button1Click(Sender: TObject);
var d, i : integer;
begin
if not savedialog1.execute then exit;
label1.Caption:=savedialog1.FileName;
assignfile(f, savedialog1.FileName);
rewrite(f);
for i:=0 to memo1.Lines. Count-1 do
begin
d:=strtoint(memo1.Lines. Strings[i]);
write(f, d);
end;
closefile(f)
end;
Процедура обработки события щелчка по кнопке Показать файл:
procedure TForm1.Button2Click(Sender: TObject);
var d:integer;
begin
reset(f); label2.Caption:='';
while not eof(f) do
begin
read(f, d);
label2.caption:=label2.caption + inttostr(d) + ' '
end;
closefile(f)
end;
Задача 55. Дан типизированный файл целых чисел. Найти сумму элементов файла и найденное число записать после последнего элемента файла.

Задача 56. Дан типизированный файл целых чисел. Переписать содержимое файла в новый типизированный файл целых чисел, изменяя порядок элементов следующим образом: сначала все отрицательные элементы, а потом все неотрицательные элементы файла.

Задача 57**. Создать типизированный файл целых чисел, содержащий большое количество нулей. Переписать содержимое файла в новый типизированный файл целых чисел, заменяя группы элементов, состоящие из нечётного количества нулей, на один нулевой элемент, а из чётного – на два.


Задача 58*. Даны два типизированных файла, причём первый a – целочисленный, а второй b – символьный. Вывести в поле метки рядом с каждым числом первого файла элемент второго файла с этим номером; если элемента второго файла с данным номером нет, то сообщить об этом.
Исходные файлы
a. dat 10 23
b. dat File, Edit, Search, View, Project

Задача 59. Дан типизированный файл целых чисел. Переписать содержимое файла в новый типизированный файл целых чисел, добавив перед первым элементом количество чётных чисел исходного файла, а после последнего элемента – количество нечётных чисел исходного файла. Полученный файл вывести в поле метки.
Исходный файл:1 43 16

Задача 60. Дан типизированный файл целых чисел. Заменить каждое число файла, кроме первого, на остаток от деления данного числа на первое число файла. ( Не используя вспомогательный файл. )
Исходный файл:15 98

Задача 61*. Дан типизированный файл целых чисел. Число элементов файла кратно 5. Записать в новый типизированный файл наибольшее значение первых 5 элементов, затем следующих 5 элементов и так далее.
Исходный файл:18 1

Задача 62**. Дан типизированный файл, содержащий различные целые числа. Найти количество элементов в наиболее длинной ²пилообразной ² последовательности файла, то есть такой, что
ai-2 < ai-1 > ai < ai+1 > …
Исходный файл:18
-5

3.6 Нетипизированные файлы
С точки зрения Object Pascal, нетипизированный файл представляет собой последовательность байтов, содержащих данные произвольного типа и структуры. Основное назначение нетипизированных файлов – обеспечение совместимости с любыми типами файлов и организация высокоскоростного обмена данными между внешними запоминающими устройствами и оперативной памятью. Описание нетипизированного файла f имеет вид:
var f : file;
В процедурах reset и rewrite для нетипизированных файлов указывается дополнительный параметр RecSize, чтобы задать размер записи, используемой при передаче файла:
procedure reset (var f : file {; RecSize : word});
procedure rewrite (var f : file {; RecSize : word});
Если параметр RecSize не указан, то принимаемая по умолчанию длина записи равна 128 байтам. Длина записи измеряется в байтах и может быть задана произвольным целым числом – от 1 байта до 2 Гбайт. Если задать длину записи, кратную 512 байт, то это позволит выполнять операции чтения-записи для нетипизированного файла с максимальной скоростью.
За исключением процедур read и write для нетипизированных файлов можно использовать все стандартные процедуры, которые допускается использовать для типизированных файлов. Вместо процедур read и write используются процедуры blockread и blockwrite, позволяющие пересылать данные с высокой скоростью:
procedure blockread( var f : file; var buf; count : integer; {var at : integer});
procedure blockwrite( var f : file; var buf; count : integer; {var at : integer});
Здесь f – имя файловой переменной, связанной с нетипизированным файлом, buf – переменная, в которую будут помещаться данные при чтении из файла или из которой будут извлекаться данные при записи в файл. Count – параметр целого типа, указывающий, какое количество записей необходимо прочитать или записать за одно обращение к файлу. Переменная buf должна иметь длину равную count*RecSize байт. Необязательный параметр at содержит количество реально прочитанных или записанных записей.
Задача 63. Составить программу для копирования файла ex2.doc, содержащего рисунок, выполненный в редакторе Word, в файл ex3.doc.
Размер одной записи в процедурах reset и rewrite установим равным 1024 байт. В процедурах blockread и blockwrite параметр count установим равным 1 (запись и считывание будут осуществляться по одной записи). В качестве буфера будем использовать переменную b, являющуюся массивом типа byte, содержащим 1024 элемента. Количество записей, содержащихся в исходном файле, определим с помощью функции filesize.
Для вывода сообщения об окончании переписывания файла будем использовать процедуру showmessage(str), параметром которой является строка выводимого сообщения.

procedure TForm1.Button1Click(Sender: TObject);
var f1, f2 : file; count, i : integer;
b : array[1..1024] of byte;
begin
if not opendialog1.Execute then exit;
assignfile(f1, opendialog1.filename);
label1.Caption:=opendialog1.filename;
if not savedialog1.Execute then exit;
assignfile(f2, savedialog1.filename);
label2.Caption:=savedialog1.filename;
reset(f1, 1024); rewrite(f2, 1024);
label3.Caption:='Размер файла ' + opendialog1.FileName
+ ' = ' + inttostr(filesize(f1));
for i:=1 to filesize(f1) do
begin blockread(f1, b, 1); blockwrite(f2, b, 1) end;
showmessage('Запись закончена')
end;


