Причина ваши данные не записываются в файл правильно, потому что вы не прохождения , Write()чтобы varправильно. headerпринимает нетипизированный Write()вход, и вы передаете ему headerпеременную as-is, поэтому вы сами передаете headerадрес памяти header. Но a stringсодержит указатель на символьные данные, которые хранятся в другом месте в памяти. Итак, чтобы записать эти данные в ваш файл, вам нужно разыменовать stringуказатель, чтобы вместо этого передать адрес памяти символьных данных.
Кроме того, если вы не хотите проверять возвращаемое значение Write()для ошибок, вы должны использовать WriteBuffer()вместо этого.
Попробуй это:
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
header := StringOfChar(#0, 11*offsetSize);
fileName := 'A: est.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(header[1], Length(header));
finally
fsOutput.Free;
end;
end;
Или:
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
header := StringOfChar(#0, 11*offsetSize);
fileName := 'A: est.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(PAnsiChar(header)^, Length(header));
finally
fsOutput.Free;
end;
end;
При этом вы действительно не должны использовать stringдвоичные данные (особенно если вы планируете обновить свой проект до Delphi 2009+. recordВместо этого вы должны использовать массив или массив, например:
private
header: array of Byte;
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
SetLength(header, 11*offsetSize);
FillChar(header[0], Length(header), #0);
fileName := 'A: est.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(header[0], Length(header));
finally
fsOutput.Free;
end;
end;
Или:
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
SetLength(header, 11*offsetSize);
FillChar(PByte(header)^, Length(header), #0);
fileName := 'A: est.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(PByte(header)^, Length(header));
finally
fsOutput.Free;
end;
end;
Или:
private
header: array[0..(11*offsetSize)-1] of Byte;
procedure Dictionary.dicRewrite;
var
i: integer;
begin
itemsCount := 0;
FillChar(header, Length(header), #0);
fileName := 'A: est.bin';
fsOutput := TFileStream.Create(fileName, fmCreate);
try
fsOutput.WriteBuffer(header, SizeOf(header));
finally
fsOutput.Free;
end;
end;