Главная страница
    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.56 MB
Время: 0.051 c
15-1198551896
Slider007
2007-12-25 06:04
2008.02.03
С днем рождения ! 25 декабря 2007 вторник


3-1190756478
vladimir_Lav
2007-09-26 01:41
2008.02.03
Временная таблица в MSSQL


15-1198567473
Vlad Oshin
2007-12-25 10:24
2008.02.03
Электричество. Объясните.


15-1196883191
Rouse_
2007-12-05 22:33
2008.02.03
Традиционное предновогоднее ММР


11-1183576848
=BuckLr=
2007-07-04 23:20
2008.02.03
OnRE_URLClick правой мышью





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский