1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Бинарное дерево, не получается сохранить и прочитать из файла
Помогите пожалуйста. Все процедуры для огранизации дерева работают. Единственное никак не получается сохранить записи в файл и при повторном запуске их прочитать.
Если заполнение дерева и его просмотр действительно работают правильно, то добавь вот это:
procedure savetree(fn: string; top: treeprt);
var
f: fileof data;
procedure print(t: treeprt);
beginif t<>nilthenbegin
print(t^.left);
write(f, t^.inf);
print(t^.right);
end;
end;
begin
assign(f, fn);
rewrite(f);
print(top);
close(f);
end;
procedure loadtree(fn: string; var top: treeprt);
var
f: fileof data;
R: data;
begin
assign(f, fn);
reset(f);
top := nil;
whilenot eof(f) dobegin
read(f, R);
top := addtree(top, R);
end;
close(f);
end;
, и вызывай там, где надо сохранить дерево в файл savetree(имя_файла, корень_дерева), а там, где надо восстановить - loadtree(имя_файла, будущий_корень_дерева)...
"Не работает" - это не ошибка... Я не знаю, работало ли все правильно ДО того, как внесены исправления. Какие данные вводились?
И потом, я не предлагал ТАК... Я предлагал передавать имя файла, а не саму файловую переменную описывать глобально и тягать ее туда-сюда... Не надо ПЕРЕДЕЛЫВАТЬ, а потом предъявлять претензии...
Претензий на самом деле нет никаких. Если я неправильно поняла, это только моя ошибка. Но дело не в этом. Задание такое, программа должна создавать дерево в файле и создавать его заново при повторном запуске. Только в этом вопрос. Я допускаю, что в моем варианте проги данные сохраняются в файле, но вот считать их оттуда не получается
Ну, смотри: сами процедуры я написал выше... Без изменений добавь их в свою программу. А вызывать - так:
beginrepeat
ClrScr;
writeln('1 - cozdanie dereva');
writeln('2 - dobavlenie lista');
writeln('3 - pods4et koli4estva vepshin');
writeln('4 - prosmotr dereva');
writeln('5 - save_tree');
writeln('6 - load_tree');
writeln('7 - vihod');
writeln('______________________');
writeln( 'vvedite punkt menu');
readln(key);
case key of{ Тут все пункты, от 1-го до 4-го }5: savetree('tree.dat', top); { <--- Можешь поменять путь к файлу }6: begin
top := nil;
loadtree('tree.dat', top); { <--- Здесь - тот же путь, что и выше... Я бы оформил его константой }end;
end{ case }until key = 7;
end.
Только что проверил... После сохранения дерева в файл и перезапуска программы дерево успешно считывается...
У меня вот затесался вопросик. Учитывая, что в данном случае мы сохраняем бинарное дерево слева направо, то оно при данном считывания вырождается в линейный список. Следовательно, как я понял, чтоб структура сохранялась процедура сохранения должна выглядеть, как идущая сверху вниз.
procedure savetree(top:treeprt; var tab: derevo);
var
f: derevo;
procedure print(top: treeprt);
begin
write(f, t^.data);
if t^.left<>nilthen print(t^.left);
if t^.right<>nilthen print(t^.right);
end;
begin
assign(tab, 'D:\spisok.txt' );
assign(f,'D:\Lab10');
rewrite(f);
print(top);
close(f);
end;
procedure loadtree(var tab: derevo; top: treeprt);
var
f: derevo;
R: data;
begin
assign(tab, 'D:\spisok.txt' );
assign(f,'D:\Lab10');
reset(f);
top := nil;
whilenot eof(f) dobegin
read(f, R);
top := addtree(top, R);
end;
close(f);
end;
Очень интересно узнать, а можно ли после записи слева направо восстановить структуру дерева?