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

Вниз

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

 
Cherepah ©   (2004-09-01 16:18) [0]

Подскажите пожалуйста, можно ли создать универсальную процедуру сохранения в файл (или чтения из него) массивов Record?
Ситуация такая:

type
 TZaved_data = record
 kod, adress, proezd, director,tel1,tel2,url : string;
end;
type
 TOther = record
   kod, naimenovanie : string;
end;

var
 Zaved_data: array of TZaved_data;
 Other: array of TOther;


Сейчас для сохранения и чтения использую формат *.csv, соответсвенно, для каждого массива приходится писать отдельную процедуру типа


readln(textfile,ch);
StrCSVToArray(ch,tmp);
SetLength(zaved_data,Length(zaved_data)+1);
with zaved_data[High(zaved_data)] do
begin
 kod:=tmp[0];
 adress:=tmp[1];
 proezd:=StrToMemo(tmp[2]);
 director:=tmp[3];
 tel1:=tmp[4];
 tel2:=tmp[5];
 url:=tmp[6];
end;


Крайне неудобно, когда массивов 6-8 штук и на каждый писать по 2 процедуры...


 
KilkennyCat ©   (2004-09-01 16:24) [1]

Var
 f : file of TOher;
 a : TOher;
begin
 ...
 read(f,a);
 ...
end;


 
Cherepah ©   (2004-09-01 16:33) [2]

Ошибки:
Type "TOther" needs finalization - not allowed in file type
Incompatible types: "TOther" and "String"


 
Семен Сорокин ©   (2004-09-01 18:25) [3]

type
TZaved_data = record
kod, adress, proezd, director,tel1,tel2,url : string;
end;
type
TOther = record
  kod, naimenovanie : string;
end;


если определишься с макс. длинной строк записи, то можешь сохранять в типизированный файл, например:

type
 TNewZaved_data = record
  kod     : string[3];
  adress  : string[20];
  proezd  : string[20];
  director: string[20];
  tel1    : string[10];
  tel2    : string[10];
  url     : string[100];
 end;

var
 f : file of TNewZaved_data;
 a : TNewZaved_data;
begin
...
read(f,a);
...
end;


иначе тебе для каждой строки придется отдельно сохранять размер (кол-во символов).


 
KilkennyCat ©   (2004-09-01 21:24) [4]


> Семен Сорокин ©   (01.09.04 18:25) [3]

гм, забыл однако, про длину записи :)


 
GuAV ©   (2004-09-01 22:55) [5]


> Подскажите пожалуйста, можно ли создать универсальную процедуру
> сохранения в файл (или чтения из него) массивов Record?

Уже написана, BlockRead зовётся, в качестве буфера - первый элемент, в качестве размера - SizeOf(TMyRecord)*(кол-во -эл-тов)


 
KSergey ©   (2004-09-02 07:50) [6]

>  [5] GuAV ©   (01.09.04 22:55)

В вопросе фигурирует тип string


 
Sapersky   (2004-09-02 11:09) [7]

Если в записях будут только строки, можно с массивом записей работать как с массивом строк.

Ну например:

Var len : Integer;
   pst : PAnsiString;
   f : TextFile;

len:=Length(Zaved_data) * SizeOf(TZaved_data) div 4;

If len>0 then begin
 AssignFile(f,"aaa.txt"); ReWrite(f);
 
 pst:=@Zaved_data[0].Kod;
 for n:=0 to len-1 do begin
   WriteLn(f, pst^); Inc(pst);
 end;
 
 CloseFile(f);
end;


 
Erik1   (2004-09-02 11:36) [8]

To Cherepah
Мне вобще кажется, что тебе надо использовать элементарную базу данных. Хотябы плоские DBF файлы. Скачай прямой драйвер с DBF и жизнь твоя станет легче. Только подумай поиск уже реализован, сортировка по индексу тоже есть. Даже в гриде записи показывать можно.


 
Cherepah ©   (2004-09-02 12:18) [9]


> Erik1   (02.09.04 11:36) [8]

Не хочется использовать БДЕ...


> GuAV ©   (01.09.04 22:55) [5]

То есть получается так?


Zaved_data, ttt2: array of TZaved_data; //TMyRecord

Var
f : file;
begin
assignfile(f,"data\test.ttt");
rewrite(f,1);
blockwrite(f,Zaved_data,sizeof(TZaved_data)*high(Zaved_data));
closefile(f);
end;
_____________________
Var
 f : file;
begin
assignfile(f,"data\test.ttt");
reset(f,1);
blockread(f,ttt2,filesize(f));
closefile(f);
end;


... acess violation at ...


 
KSergey ©   (2004-09-02 12:26) [10]

> [9] Cherepah ©   (02.09.04 12:18)
> > Erik1   (02.09.04 11:36) [8]
> Не хочется использовать БДЕ...

Разве в [8] было про БДЕ???


 
GuAV ©   (2004-09-02 12:51) [11]


> ... acess violation at ...

Да, это сохраняет содержимое записи, а string - указатель,
вот за что боролись, на то и напоролись. Т.к.

> В вопросе фигурирует тип string


Это будет работать

> если определишься с макс. длинной строк записи


 
Cherepah ©   (2004-09-02 13:29) [12]


> GuAV ©   (02.09.04 12:51) [11]

Указал длину строк - перестал даже в файл записывать...


 
Erik1   (2004-09-02 14:28) [13]

Ты когданибудь заглядывал на www.torry.net там есть и другие движки для баз данных, кроме BDE. Например "TDbf dBase Access v.6.20" хотя я использовал HALCN660. Загляни очень полезно будет.


 
Erik1   (2004-09-02 14:48) [14]

Вроде "VK DBF v.1.0.6" самое лучшее.


 
GuAV ©   (2004-09-02 15:07) [15]


>
> Указал длину строк - перестал даже в файл записывать...

??

Должен работать так

>  TNewZaved_data = record
>   kod     : string[3];
>   adress  : string[20];
>   proezd  : string[20];
>   director: string[20];
>   tel1    : string[10];
>   tel2    : string[10];
>   url     : string[100];
>  end;

BlockWrite(F, MyArray[Low(MyArray)], Length(MyArray)*SizeOf(TNewZaved_data));


 
Black-Grin ©   (2004-09-03 13:48) [16]

mreo_o1=record
 kodo:string[30];
 prot_cr:string[30];
 gr_num:string[30];
 id:string[30];
 categor:string[30];
 familiya:string[30];
 imja:string[30];
 otchest:string[30];
 birthday:string[30];
mest_rozhd,mestrab,pasport,kodreg,oblast,gorod,rayon,ulica,nomerdoma,nomerkorp,kvartira,datamed,nummed, kodmed, katspr, sroksprav,ogrspr, ocenka1,ocenka2,ocenka3, num_svidet, date_svid, pro1,pro2,pro3:string[30];
end;

assignfile(d,"ss.ss");
rewrite(d,1);
BlockWrite(d, mreo1o[Low(mreo1o)], Length(mreo1o)*SizeOf(mreo_o1));
closefile(d);

У меня тоже не работает - создаёт просто пустой файл ;(
ПРикол весь в том, что я использу tdbf, и чтоб подкоректировать таблицу - заменить нужные символы мне пришлось вынести tdbf в отдельную программу, так-как он не закрывает файл после доступа к ней до закрытия приложения, и я не могу сделать ресет этому файлу ;(  Дык вот теперь хочу масивы с инфой загнать в то приложение и не получается ;(


 
Erik1   (2004-09-03 15:29) [17]

Если даже после Close незакрывает, то это серезный баг. Попробуй VK DBF там такой ерунды быть недолжно. Сам использовал HALCN для многопоточной записи и все работало нормально, конечно писалось в обном потоке я сам синхнонизировал.


 
Access Violation   (2004-09-03 16:29) [18]

>Cherepah ©   (02.09.04 12:18) [9]
массив динамический - зделай setlength. усё будет работать.



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

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

Наверх




Память: 0.51 MB
Время: 0.051 c
3-1092904824
Slash
2004-08-19 12:40
2004.09.19
Удаление таблицы


11-1080647045
Viner
2004-03-30 15:44
2004.09.19
PBitMap


14-1093497132
КаПиБаРа
2004-08-26 09:12
2004.09.19
Опрос


14-1093529790
Gero
2004-08-26 18:16
2004.09.19
Браузеры


14-1093764725
Damatrion
2004-08-29 11:32
2004.09.19
WinApi