Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Сохранить строку в бинарный файл


Автор: transserg 15.11.2009, 16:49
привет всем, возник вопрос почему строка которая записанная в бинарный файл при чтении ее оттуда это куча мусора?
вот код
Код

type
  MyFormat=record
    Len:WORD;
    Str:Array of byte;
  end;  

Procedure SaveF(S:String);
  var
    MyFile:THandle;
    re:longword;
    Sav:MyFormat;
  begin
    MyFile:=CreateFile('log.bin', $40000000, 2, nil, 2, 128, 0);
    sav.Len:=Length(s);
    SetLength(sav.Str,sav.Len);
    CopyMemory(@sav.Str[0], @s[1], sav.Len);
    WriteFile(MyFile, sav,sav.len+2, Re, nil);
    CloseHandle(MyFile);
  end;

Function ReadF:string;
  var
    MyFile:THandle;
    re:longword;
    Sav:MyFormat;
  begin
    MyFile:=CreateFile('log.bin', GENERIC_READ ,FILE_SHARE_READ, nil, OPEN_EXISTING,0, 0);
    ReadFile(MyFile, sav,2, Re, nil);
    SetLength(sav.Str,sav.len);
    ReadFile(MyFile, sav.Str[0], sav.len, re, nil);
    CloseHandle(MyFile);
    SetString(Result, PChar(@sav.Str[0]),sav.len);
  end;

Автор: Nellas 16.11.2009, 09:22
Много лишнего, поэтому и не правильно работает, зачем переносить строку в массив, не проще ли сразу писать в файл из памяти?

вот примерная реализация, поддерживает WideString:
Код

procedure SaveToFile(const aText: string);
var
  mFile: THandle;
  mSize: Cardinal;
  mRe: Cardinal;
begin
  mSize := Length(aText) * SizeOf(Char);
  if mSize > 0 then
  begin
    mFile := CreateFile('log.bin', $40000000, 2, nil, 2, 128, 0);
    WriteFile(mFile, mSize, SizeOf(Cardinal), mRe, nil);
    WriteFile(mFile, aText[1], mSize, mRe, nil);
    CloseHandle(mFile);
  end;
end;

function LoadFromFile: string;
var
  mFile: THandle;
  mSize: Cardinal;
  mRe: Cardinal;
begin
  mFile := CreateFile('log.bin', $40000000, 2, nil, 2, 128, 0);
  ReadFile(mFile, mSize, SizeOf(Cardinal), mRe, nil);
  SetLength(Result, mSize div SizeOf(Char));
  ReadFile(mFile, Result[1], mSize div SizeOf(Char) * SizeOf(Char), mRe, nil);
  CloseHandle(mFile);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)