Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
4-93312
Ihor Osov'yak
2002-10-16 16:54
2002.11.28
WriteProcessMemory


3-92844
zool
2002-11-12 16:59
2002.11.28
Подскажите по поводу dbf


1-93099
VJar
2002-11-16 15:37
2002.11.28
Ошибка при работе с типизованным файлом


14-93202
Куртка
2002-11-10 00:07
2002.11.28
Юрию Федорову


1-92965
AVD
2002-11-15 10:55
2002.11.28
События в ОЛЕ ???