Страница 1 из 1

Сохранение и загрузка списка

Добавлено: 13 апр 2009, 21:58
GRIPH
Люди, кто может объяснить хотя бы, как сохранять список 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;

Re: Сохранение и загрузка списка

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

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

Re: Сохранение и загрузка списка

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

Т.е. по идее все правильно, а дело в "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 не работает... выбрасывает с ошибкой ввода-вывода..

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

Re: Сохранение и загрузка списка

Добавлено: 14 апр 2009, 09:51
Naeel Maqsudov
&quot писал(а):список грузит в обратном порядке
Вы добавляете элементы в начало списка каждый раз. А надо в конец. Поищите мои сообщения примерно 1-2-месячной давности со словом "список". Были готовые процедуры для добавления элементов в начало, в конец, в заданную позицию...
&quot писал(а):EOF не работает
Непонятно, где возникает ошибка на EOF или на Readln?
while not eof(F) do... должно работать безотказно. Возьмите список из 3-5 элементов и проверйте под отладчиком.