Помогите сохранить структуру в файл.
TYPE
NEW=record
A:string[10];
B:integer;
C:BitMap;
end;
File of NEW - не катит, точно нужно что - то другое ?!
|
||||||||||||||||||||||||
|
Помогите сохранить структуру в файл.
TYPE
NEW=record
A:string[10];
B:integer;
C:BitMap;
end;
File of NEW - не катит, точно нужно что - то другое ?!
У записи должен быть ограниченый размер для того, чтобы сделать типизированный файл. Делай нетипизированный. Все равно типизированный - это не текстовый а бинарный формат. Текстовый - textfile.
Можешь привести пример хранения в одном файле информации типа string (записи о человеке: ФИО и т.д.) и bitmap'а (image.picture.bitmap - правильный JPGFLIE). Сейчас у меня они хранятся в разных файлах и мне приходиться поддерживать ссылочную целостность. А хочу чтобы чтение из одного единственного файла полностю заполняло мою структуру (та где есть и string и bitmap).
Можешь привести пример хранения в одном файле информации типа string (записи о человеке: ФИО и т.д.) и bitmap'а (image.picture.bitmap - правильный JPGFLIE). Сейчас у меня они хранятся в разных файлах и мне приходиться поддерживать ссылочную целостность. А хочу чтобы чтение из одного единственного файла полностю заполняло мою структуру (та где есть и string и bitmap).
Используй BlockRead/BlockWrite - можно записывать например такую структуру:
[размер таблицы адресов][начало]
[размер строки]строка[размер рисунка]рисунок
[размер строки]строка[размер рисунка]рисунок
[размер строки]строка[размер рисунка]рисунок
...
[конец][таблица адресов]
таблица адресов - таблица смещений, на каждую запись (если нужен поиск)... хотя это и туповато немного...
кодируй в base64
кодируй в base64
А-ээ... в Base64 говоришь?
А-ээ... в Base64 говоришь?
Да, кстати, если надо могу дать алгоритм =)
Да, кстати, если надо могу дать алгоритм =)
Давай, буду рад...
Давай, буду рад...
писал когда-то...
function EncodeBase64(const inStr: string): string;</p> <p> function Encode_Byte(b: Byte): char;<br /> const<br /> Base64Code: string[64] =<br /> 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';<br /> begin<br /> Result := Base64Code[(b and $3F)+1];<br /> end;</p> <p>var<br /> i: Integer;<br /> begin<br /> i := 1;<br /> Result := '';<br /> while i < =Length(InStr) do<br /> begin<br /> Result := Result + Encode_Byte(Byte(inStr[i]) shr 2);<br /> Result := Result + Encode_Byte((Byte(inStr[i]) shl 4) or (Byte(inStr[i+1]) shr 4));<br /> if i+1 < =Length(inStr) then<br /> Result := Result + Encode_Byte((Byte(inStr[i+1]) shl 2) or (Byte(inStr[i+2]) shr 6))<br /> else<br /> Result := Result + '=';<br /> if i+2 < =Length(inStr) then<br /> Result := Result + Encode_Byte(Byte(inStr[i+2]))<br /> else<br /> Result := Result + '=';<br /> Inc(i, 3);<br /> end;<br /> end;</p> <p>// Base64 decoding<br /> function DecodeBase64(const CinLine: string): string;<br /> const<br /> RESULT_ERROR = -2;<br /> var<br /> inLineIndex: Integer;<br /> c: Char;<br /> x: SmallInt;<br /> c4: Word;<br /> StoredC4: array[0..3] of SmallInt;<br /> InLineLength: Integer;<br /> begin<br /> Result := '';<br /> inLineIndex := 1;<br /> c4 := 0;<br /> InLineLength := Length(CinLine);</p> <p> while inLineIndex < =InLineLength do<br /> begin<br /> while (inLineIndex < =InLineLength) and (c4 < 4) do<br /> begin<br /> c := CinLine[inLineIndex];<br /> case c of<br /> '+' : x := 62;<br /> '/' : x := 63;<br /> '0'..'9': x := Ord(c) - (Ord('0')-52);<br /> '=' : x := -1;<br /> 'A'..'Z': x := Ord(c) - Ord('A');<br /> 'a'..'z': x := Ord(c) - (Ord('a')-26);<br /> else<br /> x := RESULT_ERROR;<br /> end;<br /> if x < > RESULT_ERROR then<br /> begin<br /> StoredC4[c4] := x;<br /> Inc(c4);<br /> end;<br /> Inc(inLineIndex);<br /> end;</p> <p> if c4 = 4 then<br /> begin<br /> c4 := 0;<br /> Result := Result + Char((StoredC4[0] shl 2) or (StoredC4[1] shr 4));<br /> if StoredC4[2] = -1 then Exit;<br /> Result := Result + Char((StoredC4[1] shl 4) or (StoredC4[2] shr 2));<br /> if StoredC4[3] = -1 then Exit;<br /> Result := Result + Char((StoredC4[2] shl 6) or (StoredC4[3]));<br /> end;<br /> end;<br /> end;
Я бы сделал по другому. Зачем какие-то промежуточные геморои с Base64?
Есть же FileStream!
TYPE
TNEW=record // не понимаю, как тебе Delphi разрешил обозвать тип словом new? Я добавил T для приличия
A:string[10];
B:integer;
C:BitMap; // а че за Bitmap? Может TBitmap?
end;
procedure SaveFile(filename: string);
var
FS : TFileStream;
i: integer;
begin
// Чтобы не заморачиваться удаляем просто файл, если вдруг он уже есть
DeleteFile(PAnsiChar(filename));
FS := TFileStream.Create(filename,fmOpenWrite or fmCreate);
try
// Сначала записываем кол-во записей, которые у тебя где-нибудь в массиве или еще где
FS.Write(RecordsCount,sizeof(RecordsCount));
for i:=0 to RecordsCount-1 do
SaveRecord(Records[i],FS); // Records - это твой массив из структур
finally
FS.Free;
end;
end;
procedure SaveRecord(Rcd: TNew; FS: TFileStream);
begin
FS.Write(Rcd.A,10);
FS.Write(Rcd.B,sizeof(Rcd.B));
Rcd.C.SaveToStream(FS);
end;
Ну а как прочитать - в том же порядке только Read, надеюсь догадаешься.
Я бы сделал по другому. Зачем какие-то промежуточные геморои с Base64?
Есть же FileStream!
TYPE
TNEW=record // не понимаю, как тебе Delphi разрешил обозвать тип словом new? Я добавил T для приличия
A:string[10];
B:integer;
C:BitMap; // а че за Bitmap? Может TBitmap?
end;
procedure SaveFile(filename: string);
var
FS : TFileStream;
i: integer;
begin
// Чтобы не заморачиваться удаляем просто файл, если вдруг он уже есть
DeleteFile(PAnsiChar(filename));
FS := TFileStream.Create(filename,fmOpenWrite or fmCreate);
try
// Сначала записываем кол-во записей, которые у тебя где-нибудь в массиве или еще где
FS.Write(RecordsCount,sizeof(RecordsCount));
for i:=0 to RecordsCount-1 do
SaveRecord(Records[i],FS); // Records - это твой массив из структур
finally
FS.Free;
end;
end;
procedure SaveRecord(Rcd: TNew; FS: TFileStream);
begin
FS.Write(Rcd.A,10);
FS.Write(Rcd.B,sizeof(Rcd.B));
Rcd.C.SaveToStream(FS);
end;
Ну а как прочитать - в том же порядке только Read, надеюсь догадаешься.
Попробую...
ему же в стринг нужно было а не в filestream )