Показать сообщение отдельно

  #8  
Старый 09.08.2009, 13:16
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

Вот навоял функцию для чтения строк из файла на Win API с поддержкой Win и nix форматов файла.

Код:
function ReadString(h:THANDLE; var s:string; max:integer):boolean;
var
  buf:pchar;
  rb:dword;
  p:dword;
begin
  result := false;
  getmem(buf, max);
  ReadFile(h, buf^, max, rb, nil);
  if rb > 0 then
  begin
    result := true;
    p := pos(#10, string(buf));
    if p = 0 then // если последняя строка
    begin
      s := string(buf);
    end
    else
    begin
      if (p > 1) and (buf[p-2] = #13) then // если Win формат
      begin
        s := copy(buf, 0, p-2);
      end
      else // если NIX формат
      begin
        s := copy(buf, 0, p-1);
      end;
      SetFilePointer(h, p - rb, nil, FILE_CURRENT);
    end;
  end;
  freemem(buf);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  h:THANDLE;
  s:string;
  x:integer;
const
  MAX_LEN = 256;
begin
  h := CreateFile('e:\test.txt', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if h <> INVALID_HANDLE_VALUE then
  begin
    for x := 1 to 10 do
    begin
      if ReadString(h, s, MAX_LEN) then // читаем строку
      begin // если считалась
        memo1.Lines.Add('Строка ' + inttostr(x) + ' - ' + s);
      end
      else break; // прерывем цикл если нет больше строк
    end;
    CloseHandle(h);
  end;
end;
 
Ответить с цитированием