Причина ваши данные не записываются в файл правильно, потому что вы не прохождения , 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;