Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 127

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Такая ситуация: есть лог файл, который постоянно дописывается (его ведет сторонняя программа). Нужно его периодически читать и обрабатывать (раз в 5 минут например).
Как сделать так, что бы не пришлось заново весь файл читать, а только то, что дописалось.
Знаю, что есть функция seek, но не знаю как запомнить текущее положение курсора?
Заранее благодарен!

volonter Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: volonter (статус: Посетитель)
Вопрос отправлен: 6 мая 2010, 22:41
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 7 мая 2010, 13:11; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 7 мая 2010, 08:19 [#1]:

Цитата (volonter):

но не знаю как запомнить текущее положение курсора

В переменной типа Int64.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 7 мая 2010, 08:37 [#2]:

В данном случае самым простым решением будет проверить переменную, в которой сохраняется номер строки предидущего считывания, после чего присвоить значение этой переменной счетчику, по которому в цикле с условием While not EOF, считывать строки и попутно увеличивать счетчик, после чего сохранить значение счетчика в переменную.
SOA

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

SOA (статус: Посетитель), 7 мая 2010, 11:35 [#5]:

to Вадим
дык яж написал что необходима переменная, в которую будет сохранен номер строки, на которую мы в следующий раз при считывании функцией seek и прыгаем, а также нужна еще одна переменная, которая будет хранить номер символа в строке, чтоб потом курсор ровно в то место где был конец поставить.
P.S. ну а то что про seek не написал, так ето подразумевалось, т.к. автор вопроса написал что знает про эту функцию.
Вадим К

Вадим К (статус: Академик), 7 мая 2010, 12:50 [#6]:

seek не оперирует "номером строки". она не может "прыгнуть на определенную строку", только номер байта. К примеру, для бинарного файла понятия "номер строки" не существует.
Но если работать с номером строки, то каждый раз при поиске "хвоста" придется перечитать в холостую файл.
Галочка "подтверждения прочтения" - вселенское зло.
SOA

SOA (статус: Посетитель), 7 мая 2010, 13:11 [#7]:

Пардон запамятовал.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.