Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.04 c
15-1198493736
FreeBSD
2007-12-24 13:55
2008.02.03
Gambas


3-1190719104
oleg_v
2007-09-25 15:18
2008.02.03
DBF - как полностью удалить запись из таблицы


15-1198589863
Prohodil Mimo
2007-12-25 16:37
2008.02.03
FastReport align в TfrxCrossView


15-1199182043
palva
2008-01-01 13:07
2008.02.03
Директива #import Borland C++ 5.5.1


15-1198128892
Artur
2007-12-20 08:34
2008.02.03
Поиск текста в pdf





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский