![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при работе с типизованным файлом [D5, Win95/98, Win2k]
VJar © (2002-11-16 15:37:00)...
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-17 12:05:00) [1]Удалено модератором
Юрий Зотов (2002-11-17 11:59:00) [2]> VaS
1. Я и не расстраиваюсь. С чего?
2. Это не ошибка, а было пропущено умышленно. Странно, что не всем это очевидно.
> Fantasist
Поправка не по делу. Незачем засорять ответы деталями, не имеющими прямого отношения к сабжу. А если уж пишете про выравнивание, так надо любо объяснить человеку, что это такое, либо дать ссылку, где о нем прочитать. Иначе больше напоминает придирку к словам, а не поправку. Цель?
Fantasist (2002-11-17 08:52:00) [3]
> Не расстраивайтесь Вы так, Юрий
Точно! Мы ведь не в качестве подавления или самовыпячивания, а наоборот, для поддержки. Думаю, никто не сомневается, что Вы об этом знаете, а вот если бы
> так никто и не узнал бы
то эти никто потом могли бы еще долго голову ломать попадись им такой трюк.
Так что хоть и не Архиважнейшаяно все-таки поправка.
VaS (2002-11-17 08:05:00) [4]Не расстраивайтесь Вы так, Юрий. Все ошибаются :)
Юрий Зотов (2002-11-17 01:41:00) [5]> Fantasist
Архиважнейшая и чрезвычайно полезная поправка. Главное, по самой сути сабжа. Нисколько не уводит в сторону от темы.
Tnx. А то так никто и не узнал бы.
Fantasist (2002-11-17 00:24:00) [6]
> Проверьте сами - SizeOf(TRec) всегда даст 111 (2 + 101 +
> 4 + 4),
А вот и нет. :) Скорее всего 112. Выравнивание. :)
Хотя, то что независимо, это точно.
Gigabyte (2002-11-16 15:59:00) [7]Проблема возникает из-за того, что система записывает в файл не сами данные из 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");
Юрий Зотов (2002-11-16 15:47:00) [8]Desc и Content - это адреса объектов в текущем сеансе работы. Сохранять их в файле бессмысленно, надо сохранять не адреса, а сами строки.
Проверьте сами - SizeOf(TRec) всегда даст 111 (2 + 101 + 4 + 4), независимо от того, что содержится в StringList"ах.