Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Сохранение динамического массива в файл   Найти похожие ветки 

 
Mixail ©   (2008-01-11 16:55) [40]

Palladin, попытаюсь с "1". Если обратили внимание, я указал свойство "MyWideStr", а его тип назначил shortstring. Когда использовал  массив из widestring даже внутри статического массива, при чтении из файла прога вызывает исключение. А применив массив из single, в результате получаю искаженные значение, обычно длинные значения после DecimalSeparator. Из-за чего, по-вашему?


 
Palladin ©   (2008-01-11 16:56) [41]


> [40] Mixail ©   (11.01.08 16:55)


> Когда использовал  массив из widestring даже внутри статического
> массива, при чтении из файла прога вызывает исключение


> А применив массив из single, в результате получаю искаженные
> значение, обычно длинные значения после DecimalSeparator.


кусочек кода записи/чтения покажи, так никто тебе не скажем в чем ошибка


 
Mixail ©   (2008-01-11 17:00) [42]

Palladin, тот же самый код, со статическим массивом:

type
MyRecord = record
SingleNn: array [0..9] of single;    
WideStr: array [0..9] of widestring;    
end;

fs:=TFileStream.Create("MyRec.dat", fmCreate);
fs.Write(Rec,sizeof(Rec));
fs.Free;


 
Сергей М. ©   (2008-01-11 17:05) [43]


> Mixail ©   (11.01.08 17:00) [42]


И в чем проблема, ув. Михуил ?

По случаю уж децл вопросов:

- где packed record ?
- какого ляда ты пользуешь Write вместо WriteBuffer ?
- как объявлен Rec ?


 
Palladin ©   (2008-01-11 17:10) [44]

ну ты молодец конечно, singl"ы должны сохранится как есть, а вот с WideStr проблемка, WideStr:array [0..9] of widestring есть 10 элемеyтов указателей, вот ты эти указатели и сохраняешь, тут не прокатит так просто

надо так

var
n:Integer;

fs:=TFileStream.Create("MyRec.dat", fmCreate);
fs.Write(Rec.SingleNm,SizeOf(Rec.SingleNm));
for i:=0 to 9 Do
Begin
 n:=Length(Rec.WideStr[i]);
 fs.Write(n,SizeOf(n));
 fs.Write(Rec.WideStr[i][1],n*2); // бо размер символа в WideStr 2 байта
End;
fs.Free;

соответственно код чтения
Var
n:Integer;

fs.Read(Rec.SingleNm,SizeOf(Rec.SingleNm));
For i:=0 to 9 Do
Begin
 fs.Read(n,SizeOf(n))l;
 SetLength(Rec.WideStr[i],n);
 fs.Read(Rec.WideStr[i][1],n*2);
End;


 
Mixail ©   (2008-01-11 17:14) [45]

Сергей М., чего приятного тебе от дурных и бескультурных выражений, у тебя тоже наступит возраст как у меня, будет не сладко когда пацаны будут дурно тебе выражаться.


 
Сергей М. ©   (2008-01-11 17:17) [46]


> Mixail ©   (11.01.08 17:14) [45]


Михуил, изволь использовать packed.
Будет приятно)


 
Palladin ©   (2008-01-11 17:19) [47]


> [46] Сергей М. ©   (11.01.08 17:17)

а зачем? размер всех элементов 4 байта (в приведенном примере)


 
Mixail ©   (2008-01-11 17:22) [48]

Palladin, благодарю. Попробую твой код. А single действительно из файла возвращают искаженные цифры. Double работает нормально.


 
Palladin ©   (2008-01-11 17:25) [49]


> А single действительно из файла возвращают искаженные цифры.

такого просто не может быть... проверь таким образом

и до записи и после чтения выведи в Memo
For i:=0 to 9 do memo1.lines.add(Inttostr(Integer(Rec.SingleNm[i]));
если целочисленные значения не будут одинаковыми, то у тебя проблеммы или с записью или с чтением или и с тем и другим


 
Германн ©   (2008-01-11 17:26) [50]


> Palladin ©   (11.01.08 17:19) [47]
>
>

А разве по умолчанию не $A8 ?


 
Palladin ©   (2008-01-11 17:31) [51]


> [50] Германн ©   (11.01.08 17:26)

$A8, а что packed то даст?


 
Mixail ©   (2008-01-11 17:37) [52]

Испробовал все методы, наконец, по для экономичности вместо double решил исвользовать integer (умножив значение на 1000, а при чтении из файла разделив на 1000). Скорее проблема с записью single, т.к. значения я контролировал и до пересылки в структуру, и до записи в файл.


 
@!!ex ©   (2008-01-11 17:41) [53]

> [52] Mixail ©   (11.01.08 17:37)

скорее проблема в неупакованном рекорде... о котором Сергей талдычит вот уже несколько постов.


 
Palladin ©   (2008-01-11 17:46) [54]


> [53] @!!ex ©   (11.01.08 17:41)

еще раз говорю: упакованность рекорда монопенисуальна при чтении/записи


 
Германн ©   (2008-01-11 17:55) [55]


> Palladin ©   (11.01.08 17:46) [54]
>
>

А точно. Что запишет, то и прочитает.


 
Mixail ©   (2008-01-11 18:06) [56]

Выхожу, поэтому благодарю всех, кто уделил время на мою проблему и попытался помочь.


 
Sapersky   (2008-01-11 18:11) [57]

> Кроме того, если у меня 15 свойств в структуре, придется
> каждый читать и сохранить по-отдельности. Неужели невозможно
> поработать с длинами дин.массивов до чтения и сохранения,
> а в файл сохранить только саму структуру в целом.

да, к сожалению (а ксожалению ли?) это так. Еслиб было все так просто, то и объекты классов было бы здорово сохранять.


Есть на самом деле один хакерский трюк, который позволяет скидывать в файл подобные рекорды "одним изящным движением". Для классов, правда, подходит слабо, т.к. вложенные не видит.


 
Palladin ©   (2008-01-11 18:12) [58]

гы ^) и какой же позвольте узнать? :)


 
Dib@zol ©   (2008-01-11 18:15) [59]

Разыменование? =)

> гы ^)

Именно :)


 
Sapersky   (2008-01-11 18:27) [60]

It"s a kind of magic :)
Натурально, compiler magic. Т.е. работает по тому же принципу (и использует то же TypeInfo), что и magic-функции из system.pas (_InitializeArray/_FinalizeArray и т.п).
Всё никак не соберусь написать статью на эту тему, но пример, в принципе, есть, могу выложить.


 
Palladin ©   (2008-01-11 18:34) [61]

понятно, прикольно, через попу :)
статья да, будет полезна



Страницы: 1 2 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.024 c
2-1199616351
Евгений
2008-01-06 13:45
2008.02.03
базы данных


4-1183109513
евнен
2007-06-29 13:31
2008.02.03
форматирование диска без участия пользователя


2-1199563649
Pavelq
2008-01-05 23:07
2008.02.03
TListBox, CNDrawItem


15-1196332511
Tornado
2007-11-29 13:35
2008.02.03
Установка EhLib


1-1193421097
lookin
2007-10-26 21:51
2008.02.03
Чтение массива из Ini-файла