Другие языки программирования и технологии

Помогите найти ошибку в коде. делфи

Здравствуйте, у меня аткое задание " Создать типизированный файл, содержащий
слова. Заменить задан­ным значением (новое слово вводится с клавиатуры) последнее слово. "
Помогите пожалуйста найти ошибку. У меня зацикливается вывод в мемо2. Он вроде меняет строку, все хорошо, но цикл зацикливается ( Вот код:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Memo2: TMemo;

Edit1: TEdit;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure zamena();

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

f:file of string[30];

i:integer; p:string[30];

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

AssignFile(f,'file');

rewrite(f);

p:=memo1.Text;

for i := 0 to Length(p) do

write(f,p);

closefile(f);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

zamena();

end;

procedure TForm1.zamena;

var zap,s,t:string;

begin

reset(f);

zap:=Edit1.Text;

while not eof(f) do begin

for i := 0 to length(p) do begin

t:=memo1.lines.strings[Memo1.Lines.Count-1];

memo1.lines.strings[Memo1.Lines.Count-1]:=zap;

zap:=t;

end;

Memo2.Lines.Add(zap);

end;

closefile(f);

end;

end.

P.S Мне кажется косяк где-то с переменной p....Заранее спасибо
Костя .
Костя .
509
Косяк в подходе.

Начнем с создания файла. Вы объявляете переменную р длиной 30 символов, а затем пытаетесь впихнуть в нее весь текст из мемо. А если он больше 30, куда девать остальные символы? И после этого вы зачем-то в цикле записываете содержимое мемо (оно в переменной р) в файл несколько раз. Вернее, число записей будет равно максимум 31. Ну не доходит до меня смысл всего этого!

После сказанного нет смысла разбирать процедуру замены. Разве что один момент. После создания вы закрыли файл, а при замене пытаетесь заново его открыть на чтение, но кто будет связывать файловую переменную с файлом на диске, где Assign()? Ну и опять непонятные циклы. Первый до длины строки и еще один, пока не конец файла.

Если вы в мемо вводите по слову в строку, тогда выделить слова и записать их в файл очень просто

for i:=0 to memo1.Lines.Count-1 do begin
p := Memo1.Lines[i];
Write(f, p);
end;

Если же в строке несколько слов, то придется добавить еще пару, тройку строк.

Все, файл строк сформирован.

Заменить последнюю запись тоже не сложно. Заметьте, я говорю о замене строки
именно в файле (по-крайней мере, я понимаю задание так, поскольку для замены слов в мемо нет смысла заморачиваться с файлом) . Поскольку файл типизированный, то можно, во-первых, получить число записей функцией FileSize(), и, во-вторых, можно в нем позиционировать указатель процедурой Seek(). Короче, замена последней записи выполняется так

Seek(f, FileSize(f) - 1);
p := Edit1.Text;
write(f, p);

При этом, файл может быть открыт процедурой Reset(). Да, типизированные файлы, они такие, допускают модификацию при таком открытии.

Прочитать получившийся файл и отобразить его в мемо2 попробуйте самостоятельно.

И последнее. То, что вы записали

f:file of string[30];
p:string[30];

совсем не говорит о том, что файл и переменная будут содержать данные одного типа. Для того, чтобы это было так надо объявить свой тип и уже его использовать при объявлении файла и переменной

MyStr = String[30];
f : File of MyStr;
p : MyStr;
AK
Abdulaziz Kaparov
59 626
Лучший ответ
Костя . Спасибо большое. получается, когда читатем из файла пишем read(f,p); И вывод в мемо2 так- Memo2.Lines.Add(p)?
Андрей Жуков вам проще было код написать, а не объяснять))
for i := 0 to length(p) do begint:=memo1.lines.strings[Memo1.Lines.Count-1]; - получаем последню строкуmemo1.lines.strings[Memo1.Lines.Count-1]:=zap; - меняем последнюю строкуzap:=t; - изменяем zap

и так весь цикл. . .в чем смысл цикла? зачем его крутит по длине символов в переменной Р?
АЖ
Андрей Жуков
61 436
К Черту Воздух, Я Дышу Тобой... А смысл сохранять первые 30 символов из Memo столько раз, сколько в Memo символов, вы видите?
0. Код выкладывай на pastebin.com - тут читать невозможно.

1. Сохранение - вообще какое-то бредовое.

2. Проблема в этом цикле:

while not eof(f) do


в нем ничего из f не читается, соответственно, никогда не будет конца цикла.