- •1.Интегрированная среда разработки Delphi
- •2.Структура программы и типы в языке Delphi
- •3.Линейные структуры
- •4.Структуры с ветвлениями
- •5.Циклы с неизвестным числом повторений
- •6.Циклы с заданным числом повторений
- •Задание к работе
- •7.Массивы
- •8.Файлы
- •9.Подпрограммы
- •10.Динамическая память Подготовка к работе
- •Контрольные вопросы
- •Задание к работе
- •Задание 1
- •Задание 2
- •11.Исключения
8.Файлы
Подготовка к работе
По рекомендуемой литературе изучить:
типы файлов, определенные в Delphi;
связь с дисковыми файлами;
операции с типизированными файлами;
операции с текстовыми файлами;
операции с нетипизированными файлами.
Разработать алгоритмы решения в соответствии с заданием.
Составить программы решения задач.
Контрольные вопросы
Типы файлов, определенные в Delphi.
Способы связи с файлами (прямой, файловая переменная).
Файловая переменная.
Как связать файловую переменную с дисковым файлом?
Процедуры создания, открытия, закрытия типизированных файлов.
Организация прямого доступа к компонентам типизированных файлов.
Процедуры создания, открытия, закрытия текстовых файлов.
Процедуры создания, открытия, закрытия нетипизированных файлов.
Высокоскоростное копирование файлов.
Контроль ошибок работы с файлами.
Задание к работе
Выполнить 4 задания по работе с файлами. Все проекты - консольные приложения. Задания и исходные данные представлены в табл. 8 .1. Задания:
Создать программу создания и дополнения текстового файла. Сначала создать текстовый файл из 5 строк и посмотреть его содержимое. Затем добавить в этот файл произвольные строки и проверить содержимое итогового файла.
Создать программу демонстрации произвольного доступа к элементам файла. Она заносит в файл последовательно числа от N1 до N2. После записи из файла считываются на дисплей все компоненты.
Создать программу для высокоскоростного копирования файла-источника в файл-приемник. В качестве файла-источника использовать результат компиляции Prg_8_1.exe программы задачи 1, созданный ранее в папке 8_1. В качестве файла-приемника определить файл с именем Prg_8_1a.exe в папке 8_3.
Создать программу обмена данными с файлом, использующую прямое обращение к именам файлов. Она заносит в буфер N1 случайных чисел и переносит их в файл. Затем буфер обнуляется, и из файла возвращаются первые N1-2 числа.
табл. 8.1. Варианты заданий 2, 4.
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
N1 |
4 |
6 |
8 |
7 |
9 |
43 |
21 |
23 |
14 |
12 |
17 |
18 |
25 |
33 |
28 |
N2 |
9 |
11 |
16 |
21 |
19 |
58 |
44 |
46 |
25 |
29 |
34 |
42 |
53 |
44 |
43 |
Примеры выполнения
Задание 1
Создать программу создания, записи и добавления записи текстового файла. Создать текстовый файл из 5 строк и посмотреть его содержимое. Затем добавить в этот файл еще 5 строк и проверить содержимое итогового файла. Блок-схема алгоритма задания 1 приведена на рис. 8 .16.
рис. 8.16 Блок-схема алгоритма задания 1
В блоке 1 вводится имя файла на диске. В блоке 2 из известного имени папки (константа FileDir в коде программы) и этого имени генерируется путь к файлу, после чего создается файл. Если произошла ошибка, то в блоке 3 программа завершается.
Внимание! При работе с файлами в консольном приложении нельзя применять в путях к файлам символов кириллицы.
Если ошибок не произошло, то в блоке 4 открывается цикл по вводу в файл Imax строк. Ввод строк осуществляется в блоке 5. Рекомендуется вводить строки со смыслом, лучше всего числовые - 1, 2, 3...Imax. В блоке 6 файл закрывается, а затем открывается для проверки, которая организуется в блоке 8 цикла путем построчного вывода блоком 9 Imax строк. В блоке 10 файл опять закрывается, а затем открывается для дополнения, которое осуществляется в блоке 11 цикла путем построчного ввода блоком 12 еще Imax строк в хвост файла. В блоке 13 файл закрывается, а затем открывается для проверки, которая организуется в блоке 15 цикла путем построчного вывода блоком 16 всех Imax*2 строк. Для наблюдения за процессом в алгоритм введены паузы (блоки 7, 14 и 18). Окно работающего приложения задания 1 показано на рис. 8 .17.
Листинг программы:
program Prg_8_1;
{$APPTYPE CONSOLE}
uses
SysUtils, RusTrans;
const
FileDir='c:\users\PO_11\Ivanov\08_1\';;
var
MyFile: text; // Файловая переменная
FilePath,FileName,Temp: string; // Переменные для строк
i,imax: integer;
label
Exit; // Метка выхода
begin
writeln(Rus('Введите имя файла'));
readln(FileName);
writeln;
FilePath:=FileDir+FileName; // Путь к файлу
AssignFile(MyFile,FilePath); // Связь файлом на диске
{$I-} // Отключить контроль ошибок
Rewrite(MyFile); // Создать новый файл
{$I+}; // Включить контроль ошибок
if IOResult = 0 // Проверить ошибку открытия файла
then writeln(Rus('Спасибо'))
else
begin
writeln(Rus('Ошибка'));
readln;
goto Exit // Выход при ошибке
end;
writeln;
imax:=5;
writeln(Rus('Введите '),imax,Rus(' строк'));
for i:=1 to imax do // Повторять 5раз
begin
write(Rus('Строка '),i,' = ');
readln(Temp); // Чтение строки с клавиатуры
writeln(MyFile,Temp); // Запись этой строки в файл
end;
CloseFile(MyFile); // Закрыть файл
Reset(MyFile); // Открыть его для проверки
i:=1;
writeln;
writeln(Rus('Содержимое файла'));
writeln;
while not EOF(MyFile) do // Повторять до конца файла
begin
readln(MyFile,Temp); // Чтение строки из файла
writeln(Rus('Строка '),i,' = ',Temp); // Вывод этой строки
i:=i+1
end;
writeln;
CloseFile(MyFile); // Закрыть файл
{$I-} // Отключить контроль ошибок
Append(MyFile); // Открыть файл для добавления строк
{$I+}; // Включить контроль ошибок
if IOResult = 0 // Проверить ошибку открытия файла
then writeln('OK')
else
begin
writeln(Rus('Ошибка'));
readln;
goto Exit // Выход при ошибке
end;
writeln;
writeln(Rus('Введите еще '),imax,Rus(' строк'));
for i:=imax+1 to imax*2 do // Повторять 5 раз
begin
write(Rus('Строка '),i,' = ');
readln(Temp); // Чтение строки с клавиатуры
Writeln(MyFile,Temp) // Запись этой строки в файл
end;
CloseFile(MyFile); // Закрыть файл
Reset(MyFile); // Открыть его для проверки
i:=1;
writeln;
writeln(Rus('Содержимое файла'));
writeln;
while not EOF(MyFile) do // Повторять до конца файла
begin
readln(MyFile,Temp); // Чтение строки из файла
writeln(Rus('Строка '),i,' = ',Temp); // Вывод ee
i:=i+1
end;
writeln;
writeln('OK');
readln;
CloseFile(MyFile); // Закрыть файл
Exit:;
end.
рис. 8.17. Окно работающего приложения задания 1
Задание 2
Создать программу демонстрации произвольного доступа к элементам файла. Она заносит в файл последовательно числа в диапазоне от N1 до N2 (целые и положительные). После записи из файла считываются на дисплей все его компоненты с номерами (начиная с 0). Блок-схема алгоритма приведена на рис. 8 .18.
В блоке 1 пользователь по запросу вводит имя файла на диске (например, E). В блоке 2 из известного имени папки, в которой файл должен быть размещен (константа FileDir в коде программы), и этого имени генерируется путь к файлу, после чего создается файл. Если произошла ошибка, то в блоке 3 программа завершается с сообщением Error - Ошибка. Окно работающего приложения задания 2 показано на рис. 8 .19.
рис. 8.18. Блок-схема алгоритма задания 2
В противном случае в блоке 4 пользователь вводит два целых положительных числа N1 и N2. В блоке 5 определяется число компонент Imax = N2-N1, которые надо занести в файл. Блок 6 открывает цикл записи Imax компонент, в теле которого блок 7 выполняет запись в файл чисел в интервале N1..N2. В блоке 8 файл закрывается, а затем открывается для проверки, которая организуется в блоке 10 цикла путем построчного вывода блоком 11 Imax компонент из файла вместе с номерами. В блоке 12 файл закрывается. Для наблюдения за процессом в алгоритм введены паузы (блоки 9 и 13).
Листинг программы:
program Prg_8_2;
{$APPTYPE CONSOLE}
uses
SysUtils,RusTrans;
label
Exit;
const
FileDir='c:\users\PO_11\Ivanov\08_2\';;
var
MyFile: File of integer; // Файловая переменная
FilePath, FileName: string;
N1,N2,i,imax,Temp: integer;
begin
writeln(Rus('Введите имя файла'));
readln(FileName);
writeln;
FilePath:=FileDir+FileName;
AssignFile(MyFile,FilePath); // Связь файлом на диске
{$I-} // Отключить контроль ошибок
Rewrite(MyFile); // Создать новый файл
{$I+}; // Включить контроль ошибок
if IOResult = 0 // Проверить ошибку открытия файла
then writeln(Rus('Спасибо'))
else
begin
writeln(Rus('Ошибка'));
readln;
goto Exit // Выход при ошибке
end;
writeln;
writeln(Rus('Введите N1, N2'));
readln(N1,N2);
writeln;
imax:=N2-N1;
for i:=0 to imax do
begin
Temp:=N1+i;
write(MyFile,Temp) // Записать в файл значение номерa i
end;
CloseFile(MyFile);
Reset(MyFile);
writeln(Rus('Компоненты файла')); // Открыть файл для проверки
for i:=0 to imax do // Цикл чтения
begin
Seek(MyFile,i); // Указатель файла на элемент i
read(MyFile,Temp); // Прочитать элемент
writeln(Rus('Компонент '),i,' = ',Temp);// Вывести его
end;
CloseFile(MyFile);
writeln;
writeln('OK');
readln;
Exit:;
end.
рис. 8.19. Окно работающего приложения задания 2
Задание 3
Создать программу для высокоскоростного копирования файла-источника в файл-приемник. В качестве файла-источника использовать результат компиляции Prg_8_1.exe программы задачи 1, созданный ранее. В качестве файла-приемника определить файл с именем Prg_8_1a.exe. После выполнения нужно проверить, что на диске имеется файл-приемник того же размера и содержания. Чтобы убедиться в этом, можно этот файл исполнить.
Листинг программы:
program Prg_8_3;
{$APPTYPE CONSOLE}
uses
SysUtils,RusTrans;
label
Exit;
const
FileDir1='c:\users\PO_11\Ivanov\08_1\';
FileDir2='c:\users\PO_11\Ivanov\08_3\';
var
InFile,OutFile: File; // Файловые переменные
Buf: array[1..512] of byte; // Буфер
FilePath1,FilePath2: string; // Пути к файлам
i,j: integer;
begin
FilePath1:=FileDir1+'prg_8_1.exe';
AssignFile(InFile,FilePath1); // Связь с файлом источником
FilePath2:=FileDir2+'prg_8_1a.exe';
AssignFile(OutFile,FilePath2); // Связь с файлом приемником
Reset(InFile,512); // Открыть файл источник
Rewrite(OutFile,512); // Создать файл приемник
writeln(Rus('Файл источник '),FilePath1);
writeln(Rus('Файл приемник '),FilePath2);
writeln;
writeln(Rus('Копировать файл?'));
readln;
writeln(Rus('Копирование начато'));
writeln;
while not EOF(InFile) do
begin
BlockRead(InFile,Buf,1,i) // Читать из InFile в буфер
BlockWrite(OutFile,Buf,1,j)// Писать из буфера в OutFile
end;
writeln(Rus('Копирование завершено'));
readln;
CloseFile(InFile); // Закрыть файл источник
CloseFile(OutFile); // Закрыть файл приемник
end.
Задание 4
Создать программу обмена данными с файлом, использующую связь с файлами без файловых переменных. Она заносит в буфер 6 случайных чисел и переносит их в файл (он создается в папке проекта). Затем буфер обнуляется, и из файла возвращаются первые 4 числа. Окно работающего приложения задания 4 показано на рис. 8 .20
Листинг программы:
program Prg_8_4;
{$APPTYPE CONSOLE}
uses
SysUtils,RusTrans;
const
Count=6; // Константа Count
var
hMyFile: Integer; // Дескриптор файла
Buffer: Array[1..Count] of Byte; // Буфер
i, Fact: Integer;
begin
hMyFile:=FileCreate('MyFile'); // Создать файл
writeln(Rus('В буфере случайные числа'));
Randomize;
for i:=1 to Count do // Заполнить буфер
begin
Buffer[i]:= Random(100);
writeln(' ', Buffer[i]); // Вывод буфера на дисплей
end;
Fact:=FileWrite(hMyFile, Buffer, Count); // Запись в файл
writeln(Rus('В файл записаны '),Fact);
readln;
writeln(Rus('Буфер очищается'));
for i:=1 to Count do
begin
Buffer[i]:=0;
writeln(' ',Buffer[i]); // Вывод буфера на дисплей
end;
readln;
FileSeek(hMyFile, 0, 0); // Установить маркер на начало файла
Fact:=FileRead(hMyFile, Buffer, Count-2); // Чтение из файла
writeln(Rus('Из файла в буфер прочитаны'));
for i:=1 to Count do
begin
writeln(' ',Buffer[i]); // Вывод буфера на дисплей
end;
writeln(Rus('В буфере не нулевых чисел '),Fact);
FileClose (hMyFile); // Закрыть файл
readln;
end.
рис. 8.20. Окно работающего приложения задания 4
Выводы
В Delphi определены типизированный, текстовый и нетипизированный файлы.
Связь с файлами может быть через файловые переменные или по именам.
При применении файловых переменных для связи с файлами на диске используется процедура AssignFile.
В типизированном файле возможен произвольный доступ к компоненту с любым номером.
В текстовом файле произвольный доступ к символу невозможен. Можно обращаться к строкам текста.
Нетипизированные файлы полезны для скоростного копирования.