прочитать последнюю строку файла {WinAPI}

CherniyMak
Дата: 21.11.2007 14:15:32
Подскажите пожалуста как прочитать послуднюю строку файла. Есть программа которая должна вытаскивать в файл данные датасета по определенному алгоритму (на SQL его писать гемор - токо вручную). Функции работы с файлами решил писать низкоуровневыми.

var
  fil: THandle;
  t: Cardinal;
begin
  fil := Windows.CreateFile(PChar(dir + '\file.txt'),
           GENERIC_WRITE OR GENERIC_READ, FILE_SHARE_READ,
           NIL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if fil = INVALID_HANDLE_VALUE then exit;
  // далее пишем служебную информацию и пускаем процедуру
  CloseHandle(fil);
end;

{в ней используется следующая процедура}

procedure mWrite;
// пишем в файл -> надо сделать чтоб писало с прибавлением
{var  r: string;}
begin
  {SetFilePointer( fil, -t, nil, FILE_CURRENT );
  ReadFile( fil, r, t, t, nil); ShowMessage(r);}
  s := Da + ';' + Ti + ';' + IntToStr(Id) + ';' + IntToStr(Et) + ';' + nu + #13#10;
  WriteFile(fil, PChar(s)^, length(s), t, nil);
end;

В этой процедуре надо прочитать предыдущую запись да что то не получается. Переменная t - байты записанные в предыдущие раз.
CherniyMak
Дата: 21.11.2007 14:23:16
естественно моно запомнить последнюю строку в дополнительной переменной. Просто хочется научится юзать АПИ по полной
Dimitry Sibiryakov
Дата: 21.11.2007 14:28:05

CherniyMak

Просто хочется научится юзать АПИ по полной

Тогда определись: ты пишешь в файл, читаешь из него или хочешь приписать
в конец. В любом случае, API оперирует байтами а не строками. Так что
надо искать последний конец строки. С начала файла или немного отступив
от конца - решать по обстоятельствам.

Posted via ActualForum NNTP Server 1.4

Мимопроходящий
Дата: 21.11.2007 14:29:42

Привет, CherniyMak!
Ты пишешь:

CherniyMak
C> естественно моно запомнить последнюю строку в дополнительной переменной.
C> Просто хочется научится юзать АПИ по полной
API не самоцель.
на каждый чих городить низкоуровневые конструкции - нет смысла.

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4

S.G.
Дата: 21.11.2007 16:42:58
Мимопроходящий

API не самоцель.
на каждый чих городить низкоуровневые конструкции - нет смысла.
+1

CherniyMak
(на SQL его писать гемор - токо вручную). Функции работы с файлами решил писать низкоуровневыми.
SQL-гемор, работа с файлом- низкоуровневая...
а может быть, стОит переосмыслить подход?
Anatoly Podgoretsky
Дата: 21.11.2007 18:31:43
WinAPI со строками не работает, слишком низкоуровневый.
А какой размер файла?
Tellur
Дата: 22.11.2007 05:40:38
CherniyMak

  ReadFile( fil, r, t, t, nil); ShowMessage(r);
end;

В этой процедуре надо прочитать предыдущую запись да что то не получается. Переменная t - байты записанные в предыдущие раз.


А синтаксис пробовали смотреть?
MSDN
BOOL ReadFile(
HANDLE hFile, // handle to file
LPVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped // overlapped buffer
);

Предпоследний параметр - должен быть указатель на область памяти размером в 4 байта, куда функция запишет сколько байт она прочитала.
Второй параметр... опять же строку объявили а память не выделели под нее...
Следовало сделать примерно так
  SetLength(r, t);
  ReadFile( fil, r[1], t, @readed, nil); ShowMessage(r);
Разбирайтесь вобщем
Tellur
Дата: 22.11.2007 05:43:35
опечатка, вместо r[1] следует писать @r[1]
CherniyMak
Дата: 22.11.2007 06:07:14
Размер файла 4 мб. С каждым месяцем примерно увеличивается на 1 мб.
Спасибо за ответы - буду разбираться
StarWind
Дата: 22.11.2007 06:54:02
Автор, почитайте хелп по TFileStream, честное слово, поможет. А так у вас получается действительно WinAPI ради WinAPI. Кстате, это далеко не низкий уровень. CreateFile это весьма продвинутая функция.