PDA

Просмотр полной версии : Сохранение и загрузка списка



GRIPH
13.04.2009, 21:58
Люди, кто может объяснить хотя бы, как сохранять список TList в файл и потом загружать оттуда же...

Написал процедуру, не работает... Вылетает эксэс виолэйшн...
Вот что получилось:



procedure TForm1.Button9Click(Sender: TObject);
var F:Textfile;
Str:string;
begin
assignFile(F,'file.txt');
rewrite(F);
while p^.next<>nil do
begin
str:=p^.Item;
write(F,str);
p:=p^.next;
end;
closeFile(F);
end;

procedure TForm1.Button10Click(Sender: TObject);
var F:Textfile;
Str:string;
q:PElem;
begin
assignFile(F,'file.txt');
Reset (F);
p:=nil;
while el>0 do
begin
new(q);
q^.next:=p;
p:=q;
readln(F,str);
p^.Item:=str;
end;
closefile(F);
end;

Naeel Maqsudov
13.04.2009, 22:14
Добавьте в Watch переменные p и q.
Поставьте в начале проблемной процедуры точку останова.
Выполняйте процедуру под отладчиком.
Так как p - это глобальная переменная, то похоже, что она остается непроинициализированной.

А вообще откажитесь от списков. Зачем они Вам? Используйте TStrings/TStringList. Там есть готовые методы сохранения и загрузки.

GRIPH
13.04.2009, 22:37
У меня курсовой.. Иначе я бы к ним и не прикоснулся бы даже...

Т.е. по идее все правильно, а дело в "p"?

-------- Во избежании флуда...

Сделал, сохраняет все отлично... но сохраняет все в сплошную строку... Как быть? Добавить 13й символ в конце? И как потом считывать?


-------- Туда же)

Сделал, при помощи Writeln, а не Write...
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
Вот.. Переделал, только список грузит в обратном порядке, как инвертировать?? Т.е. был 1 2 3 4, стал 4 3 2 1. В первом случае head = 1, во втором head = 4.. Вот код:


procedure TForm1.Button9Click(Sender: TObject);
var F:Textfile;
Str:string;
begin
p:=head;
assignFile(F,'save.active');
rewrite(F);
while p^.next<>nil do
begin
str:=p^.Item;
writeln(F,str);
p:=p^.next;
end;
closeFile(F);
end;

procedure TForm1.Button10Click(Sender: TObject);
var F:Textfile;
Str:string;
q:PElem;
cnt,eln:integer;
begin
assignFile(F,'save.active');
Reset (F);
p:=nil;
cnt:=0;
eln:=0;

while 100>cnt do
begin
new(q);
readln(F,str);
q^.Item:=str;
q^.next:=p;
head:=q;
p:=q;
q:=q^.next;
cnt:=cnt+1;
end;
closefile(F);
end;


цифра 100 в while, потому что я не знаю кол-во строк в файле, EOF не работает... выбрасывает с ошибкой ввода-вывода..

Помогите доделать пожалуйста...

Naeel Maqsudov
14.04.2009, 09:51
список грузит в обратном порядке

Вы добавляете элементы в начало списка каждый раз. А надо в конец. Поищите мои сообщения примерно 1-2-месячной давности со словом "список". Были готовые процедуры для добавления элементов в начало, в конец, в заданную позицию...

EOF не работает

Непонятно, где возникает ошибка на EOF или на Readln?
while not eof(F) do... должно работать безотказно. Возьмите список из 3-5 элементов и проверйте под отладчиком.