ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 15.01.2021

Просмотров: 321

Скачиваний: 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;