ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 15.01.2021
Просмотров: 322
Скачиваний: 1
Файловый указатель должен быть связан с внешним файлом процедурой AssignFile, с последующим использованием процедур Reset, Rewrite или Append. Если текстовый файл открывался с помощью Reset, то возникает ошибка при записи в файл. Также возникает ошибка при чтении текстового файла, который открывался Rewrite или Append.
Пример 1. Запись в текстовый файл двумерного массива.
Листинг 6.1.а.
var x: array[1..n,1..m] of real;
F: filetext;
i,j: integer;
begin
AssignFile(f,’f.txt’); Rewrite(f);
for j:=1 to m do begin
Write(f,j:3,’ ‘);
for i:=1 to n do Write(f,x[i,j]:8:2,’ ‘);
Writeln(f);
end;
CloseFile(f);
end;
В каждой строке записывается номер строки и n вещественных чисел. Между числами в качестве разделителя записывается пробел. После записи каждой группы чисел происходит перевод каретки оператором Writeln(f).
Запись двухмерного массива можно реализовать несколько иначе, если мы не будем в начале каждой строки указывать номер строки.
Пример 2. Запись в текстовый файл двумерного массива.
Листинг 6.1.б.
var x: array[1..n,1..m] of real;
F: filetext;
i,j: integer;
begin
AssignFile(f,’f.txt’); Rewrite(f);
for j:=1 to m do begin
for i:=1 to n do Write(f,x[i,j]:8:2,’ ‘);
Writeln(f);
end;
CloseFile(f);
end;
Пример 3. Чтение из текстового файла двумерного массива.
Листинг 6.2.а.
var x: array[1..n,1..m] of real;
f: filetext;
i,j: integer;
begin
AssignFile(f,’f.txt’); Reset(f);
i:=0;
while not EOF(f) do
begin
Read(f,j);
for i:=1 to n do Read(f,x[i,j]);
Readln(f);
end;
CloseFile(f);
end;
Если бы при записи в файл числа не были разделены пробелами, то все они склеились, и не было возможности прочитать их заново. Обратите внимание на то, что при таком способе чтения необходимо знать значение переменной n. Если же значение этой переменной до чтения неизвестно, то удобнее использовать циклы с предусловием while и функция проверки конца строки текстового файла EOLN(f):
Листинг 6.2.б.
var x: array[1..n,1..m] of real;
f: filetext;
i,j: integer;
begin
AssignFile(f,’f.txt’); Reset(f);
i:=0;
while not EOF(f) do begin
j:=0;
while not EOLN(f) do begin
j:=j+1; Read(f,x[i,j]);
end;
Readln(f);
end;
CloseFile(f);
end;
6.5.2. Пример 1. Рисование на канве
Рассмотрим следующую задачу: в текстовом файле записано несколько строк. Каждая строка начинается с символа, обозначающего один из методов канвы. Затем в той же строке приведено несколько значений целого типа, необходимых для работы этих методов. Необходимо прочитать этот файл и построить графические примитивы на канве. В табл. 6.4 приведены первые символы строки и методы соответствующие этим символам.
Таблица 6.5
|
Символ |
Метод |
Назначение |
|
L |
LineTo(x1,y1) |
Отрезок прямой |
|
M |
MoveTo(x1,y1) |
Переместить указатель |
|
R |
RectAngle(x1,y1,x2,y2) |
Прямоугольник |
|
E |
Ellipse(x1,y1,x2,y2) |
Эллипс |
|
C |
Brush.Color:=C |
Цвет кисти |
|
C |
Pen.Color:=C |
Цвет пера |
|
T |
TextOut(x1,y1,s); |
Строка текста |
Список параметров каждого метода определяет число и тип значений, идущих в каждой строке за первым символом. Так, например, если строка начинается с символа T, то далее в строке ожидается два целых числа и строка.
Для реализации этой задачи создадим проект из одной формы FormMain, на которую выставим компоненты TMainMenu и OpenDialog. В меню определим только два пункта: Open и Exit. Создадим обработчик события Open1Click и метод формы DrawPicture(FName: string), который необходимо «прописать» в классе TFormMain (листинг 6.3):
Листинг 6.3. Описание класса формы
TFormMain = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
OpenDialog1: TOpenDialog;
procedure Exit1Click(Sender: TObject);
procedure Open1Click(Sender: TObject);
private
{ Private declarations }
procedure DrawPicture(FName: string);
public
{ Public declarations }
end;
Обработчик события Open1Click вызывает диалог OpenDialog1 и, в случае нажатия кнопки Ok, вызывает процедуру DrawPicture:
Листинг 6.4. Обработчик события Open1Click
procedure TFormMain.Open1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
DrawPicture(OpenDialog1.FileName);
end;
Основная процедура DrawPicture открывает текстовый файл и циклом while читает все строки файла (листинг 6.5).
Листинг 6.5. Процедура чтения файла и рисования DrawPicture
procedure TFormMain.DrawPicture(FName: string);
var f: textfile;
ch: char;
x1,y1,x2,y2,C: integer;
s: string;
begin
AssignFile(f,FName); Reset(f); // открыть файл
with Canvas do
begin
while not EOF(f) do begin
Read(f,ch); // чтение первого символа строки
case ch of // чтение остальных данных в строке и построение
'L': begin // линия
Readln(f,x1,y1); LineTo(x1,y1);
end;
'R': begin // прямоугольник
Readln(f,x1,y1,x2,y2); RectAngle(x1,y1,x2,y2);
end;
'E': begin // эллипс
Readln(f,x1,y1,x2,y2); Ellipse(x1,y1,x2,y2);
end;
'C': begin // установить цвет заливки
Readln(f,C); Brush.Color:=C;
end;
'c': begin // установить цвет линий
Readln(f,C); Pen.Color:=C;
end;
'T': begin // нарисовать строку символов
Readln(f,x1,y1,s); TextOut(x1,y1,s);
end;
end;
end;
end;
CloseFile(f); // закрыть файл
end;