Текущий архив: 2002.11.28;
Скачать: CL | DM;
Вниз
Ошибка при работе с типизованным файлом Найти похожие ветки
← →
VJar (2002-11-16 15:37) [0]...
Type TRec = record
ID:word;
Theme:string[100];
Desc:TStringList;
Content:TStringList;
end;
const FN = "c:\test.dat";
var
Data:TRec;
F:File of TRec;
...
//write to file FN
AssignFile(F,FN);
Rewrite(F);
with Data do
begin
id:= 1;
Theme:= "Theme1";
Desc:= TStringList.Create;
Desc.Clear;
Desc.Add("Desc1");Desc.Add("Desc2");
Content:= TStringList.Create;
Content.Clear;
Content.Add("Content1");Content.Add("Content2");
end;
write(F,Data);
CloseFile(F);
...
//Read From File FN
...
AssignFile(F,FN);
Reset(F);
Read(F,Data);
Memo1.Lines:= Data.Desc; // Тут возникает ошибка
CloseFile(F);
...
Если сразу записать и прочитать, то все нормально.
А если записать. Закрыть программу. Запустить программу. Прочитать файл,
то тогда возникает ошибка в отмеченом месте. Почему? Может я не правильно
записываю или читаю?
← →
Юрий Зотов © (2002-11-16 15:47) [1]Desc и Content - это адреса объектов в текущем сеансе работы. Сохранять их в файле бессмысленно, надо сохранять не адреса, а сами строки.
Проверьте сами - SizeOf(TRec) всегда даст 111 (2 + 101 + 4 + 4), независимо от того, что содержится в StringList"ах.
← →
Gigabyte (2002-11-16 15:59) [2]Проблема возникает из-за того, что система записывает в файл не сами данные из TStringList, а адрес памяти по которому они записаны. При повторном запуске програми этот адрес естественно меняется.
по крайней мере у меня размер записи
Rec.S.Add("Test0")
Rec.S.Add("Test1")
Rec.S.Add("Test2")
в файле не превышает 4 байта. И это я могу обяснить только вышеизложенным
Исходним поей программы:
Type TRec = packed record
A,B:Integer;
S:TStringList;
.........
var Rec:TRec
.............
Rec.A:=01;
Rec.B:=01;
Rec.S:=TStringList.Create;
Rec.S.Add("Test0");
Rec.S.Add("Test1");
Rec.S.Add("Test2");
← →
Fantasist © (2002-11-17 00:24) [3]
> Проверьте сами - SizeOf(TRec) всегда даст 111 (2 + 101 +
> 4 + 4),
А вот и нет. :) Скорее всего 112. Выравнивание. :)
Хотя, то что независимо, это точно.
← →
Юрий Зотов © (2002-11-17 01:41) [4]> Fantasist
Архиважнейшая и чрезвычайно полезная поправка. Главное, по самой сути сабжа. Нисколько не уводит в сторону от темы.
Tnx. А то так никто и не узнал бы.
← →
VaS © (2002-11-17 08:05) [5]Не расстраивайтесь Вы так, Юрий. Все ошибаются :)
← →
Fantasist © (2002-11-17 08:52) [6]
> Не расстраивайтесь Вы так, Юрий
Точно! Мы ведь не в качестве подавления или самовыпячивания, а наоборот, для поддержки. Думаю, никто не сомневается, что Вы об этом знаете, а вот если бы
> так никто и не узнал бы
то эти никто потом могли бы еще долго голову ломать попадись им такой трюк.
Так что хоть и не Архиважнейшая но все-таки поправка.
← →
Юрий Зотов © (2002-11-17 11:59) [7]> VaS
1. Я и не расстраиваюсь. С чего?
2. Это не ошибка, а было пропущено умышленно. Странно, что не всем это очевидно.
> Fantasist
Поправка не по делу. Незачем засорять ответы деталями, не имеющими прямого отношения к сабжу. А если уж пишете про выравнивание, так надо любо объяснить человеку, что это такое, либо дать ссылку, где о нем прочитать. Иначе больше напоминает придирку к словам, а не поправку. Цель?
← →
Николай Быков © (2002-11-17 12:05) [8]Удалено модератором
Страницы: 1 вся ветка
Текущий архив: 2002.11.28;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.015 c