Здравствуйте, у меня аткое задание " Создать типизированный файл, содержащий
слова. Заменить заданным значением (новое слово вводится с клавиатуры) последнее слово. "
Помогите пожалуйста найти ошибку. У меня зацикливается вывод в мемо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....Заранее спасибо
Другие языки программирования и технологии
Помогите найти ошибку в коде. делфи
Косяк в подходе.
Начнем с создания файла. Вы объявляете переменную р длиной 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;
Начнем с создания файла. Вы объявляете переменную р длиной 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;
Костя .
Спасибо большое. получается, когда читатем из файла пишем 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
и так весь цикл. . .в чем смысл цикла? зачем его крутит по длине символов в переменной Р?
и так весь цикл. . .в чем смысл цикла? зачем его крутит по длине символов в переменной Р?
К Черту Воздух, Я Дышу Тобой...
А смысл сохранять первые 30 символов из Memo столько раз, сколько в Memo символов, вы видите?
0. Код выкладывай на pastebin.com - тут читать невозможно.
1. Сохранение - вообще какое-то бредовое.
2. Проблема в этом цикле:
while not eof(f) do
в нем ничего из f не читается, соответственно, никогда не будет конца цикла.
1. Сохранение - вообще какое-то бредовое.
2. Проблема в этом цикле:
while not eof(f) do
в нем ничего из f не читается, соответственно, никогда не будет конца цикла.
Похожие вопросы
- помогите найти ошибку в коде на Си
- Помогите найти ошибку в коде
- Помогите найти ошибки в коде (паскаль)
- Помогите найти ошибку в коде с++. Скорее всего ошибка в сравнении строк.
- помогите найти ошибку в коде VBA exel !
- (PASCAL)помогите найти ошибку в коде задачи, и исправить
- помогите найти ошибку в коде. ПАскаль
- Помогите найти ошибку в коде в паскале
- Помогите исправить ошибку в коде программы на паскале.
- Помогите найти ошибку Delphi легкая программка