Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Вниз
Сохранение массива 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.418 c