|
Вопрос # 4 127/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Такая ситуация: есть лог файл, который постоянно дописывается (его ведет сторонняя программа). Нужно его периодически читать и обрабатывать (раз в 5 минут например).
Как сделать так, что бы не пришлось заново весь файл читать, а только то, что дописалось.
Знаю, что есть функция seek, но не знаю как запомнить текущее положение курсора?
Заранее благодарен!
 |
Вопрос задал: volonter (статус: Посетитель)
Вопрос отправлен: 6 мая 2010, 22:41
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 7 мая 2010, 13:11; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 7 мая 2010, 08:19 [#1]:
Цитата (volonter):
но не знаю как запомнить текущее положение курсора
В переменной типа Int64.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 7 мая 2010, 08:37 [#2]:
В данном случае самым простым решением будет проверить переменную, в которой сохраняется номер строки предидущего считывания, после чего присвоить значение этой переменной счетчику, по которому в цикле с условием While not EOF, считывать строки и попутно увеличивать счетчик, после чего сохранить значение счетчика в переменную.
|
|
SOA (статус: Посетитель), 7 мая 2010, 08:41 [#3]:
А если нужно досканально знать положение курсора, то вводи еще одну переменную, в которую сохраняй число символов из последней строки используя функцию StrLen(), ну и соответственно придется немного изменить логику цикла.
|
|
Вадим К (статус: Академик), 7 мая 2010, 10:18 [#4]:
to SOA: а если файл на сотни мегабайт, то нужно будет снова пробегать по файлу?
to volonter. идея такая.
заводим некую переменную-курсор cur. Вначале она у нас будет равна 0.
Код считывания лога будет такой. (это схематически!!!)
x := Filesize(log);
открыть файл log;
seek(log, cur);
while not eof(log) do begin
readln(log, s);
выводим s;
end;
cur := x;
закрыть файл log.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SOA (статус: Посетитель), 7 мая 2010, 11:35 [#5]:
to Вадим
дык яж написал что необходима переменная, в которую будет сохранен номер строки, на которую мы в следующий раз при считывании функцией seek и прыгаем, а также нужна еще одна переменная, которая будет хранить номер символа в строке, чтоб потом курсор ровно в то место где был конец поставить.
P.S. ну а то что про seek не написал, так ето подразумевалось, т.к. автор вопроса написал что знает про эту функцию.
|
|
Вадим К (статус: Академик), 7 мая 2010, 12:50 [#6]:
seek не оперирует "номером строки". она не может "прыгнуть на определенную строку", только номер байта. К примеру, для бинарного файла понятия "номер строки" не существует.
Но если работать с номером строки, то каждый раз при поиске "хвоста" придется перечитать в холостую файл.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SOA (статус: Посетитель), 7 мая 2010, 13:11 [#7]:
Пардон запамятовал.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|