Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_Delphi_1.doc
Скачиваний:
15
Добавлен:
18.09.2019
Размер:
1.64 Mб
Скачать

8.Файлы

Подготовка к работе

  1. По рекомендуемой литературе изучить:

  • типы файлов, определенные в Delphi;

  • связь с дисковыми файлами;

  • операции с типизированными файлами;

  • операции с текстовыми файлами;

  • операции с нетипизированными файлами.

  1. Разработать алгоритмы решения в соответствии с заданием.

  2. Составить программы решения задач.

Контрольные вопросы

  1. Типы файлов, определенные в Delphi.

  2. Способы связи с файлами (прямой, файловая переменная).

  3. Файловая переменная.

  4. Как связать файловую переменную с дисковым файлом?

  5. Процедуры создания, открытия, закрытия типизированных файлов.

  6. Организация прямого доступа к компонентам типизированных файлов.

  7. Процедуры создания, открытия, закрытия текстовых файлов.

  8. Процедуры создания, открытия, закрытия нетипизированных файлов.

  9. Высокоскоростное копирование файлов.

  10. Контроль ошибок работы с файлами.

Задание к работе

Выполнить 4 задания по работе с файлами. Все проекты - консольные приложения. Задания и исходные данные представлены в табл. 8 .1. Задания:

  1. Создать программу создания и дополнения текстового файла. Сначала создать текстовый файл из 5 строк и посмотреть его содержимое. Затем добавить в этот файл произвольные строки и проверить содержимое итогового файла.

  2. Создать программу демонстрации произвольного доступа к элементам файла. Она заносит в файл последовательно числа от N1 до N2. После записи из файла считываются на дисплей все компоненты.

  3. Создать программу для высокоскоростного копирования файла-источника в файл-приемник. В качестве файла-источника использовать результат компиляции Prg_8_1.exe программы задачи 1, созданный ранее в папке 8_1. В качестве файла-приемника определить файл с именем Prg_8_1a.exe в папке 8_3.

  4. Создать программу обмена данными с файлом, использующую прямое обращение к именам файлов. Она заносит в буфер 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

Выводы

  1. В Delphi определены типизированный, текстовый и нетипизированный файлы.

  2. Связь с файлами может быть через файловые переменные или по именам.

  3. При применении файловых переменных для связи с файлами на диске используется процедура AssignFile.

  4. В типизированном файле возможен произвольный доступ к компоненту с любым номером.

  5. В текстовом файле произвольный доступ к символу невозможен. Можно обращаться к строкам текста.

  6. Нетипизированные файлы полезны для скоростного копирования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]