Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.26;
Скачать: [xml.tar.bz2];

Вниз

Последняя строка файла   Найти похожие ветки 

 
User   (2004-01-13 15:16) [0]

Есть файлик(текстовый) , обновляется очень часто... после каждого обновления нужно получать последнюю строку файла, она каждый раз разная.
(обновился файл или нет я проверяю по размеру)
вопрос :
можно ли как то получить СРАЗУ последнюю строку?
Т.е. не читая весь файл построчно. ?
Помогите пожалуйста...


 
Андрей Сенченко   (2004-01-13 15:24) [1]

Как только Ты сможешь чисто для себя определить признак того, что строка ПОСЛЕДНЯЯ - сразу поймешь как это сделать.


 
Андрей Сенченко   (2004-01-13 15:24) [2]

Как только Ты сможешь чисто для себя определить признак того, что строка ПОСЛЕДНЯЯ - сразу поймешь как это сделать.


 
alex_***   (2004-01-13 15:32) [3]

можно читать от конца, до первого конца строки.


 
Андрей Сенченко   (2004-01-13 15:35) [4]

alex_*** © (13.01.04 15:32) [3]

А в следующий раз ему нужно будет найти ПРЕДПОСЛЕДНЮЮ - и он снова прийдет сюда потому что сам не раскопал что такое EOF и EOLN


 
alex_***   (2004-01-13 15:38) [5]

ну может не все так плохо... почему бы не помочь человеку..


 
User   (2004-01-14 07:14) [6]

Народ, я понимаю что вы знаете и лениво писать, но помогите пожалуйста. я знаю что такое EOF.
я циклом While not eof(file) читаю весь файл, и в итоге у меня получается последняя строка. но на это уходит время, а частота обновления очень критична в моей задаче.
Можно ли по другому это сделать?


 
Anatoly Podgoretsky   (2004-01-14 07:49) [7]

alex_*** © (13.01.04 15:32) [3]
И вероятнее всего этим методом он не получит не одной строки.


 
REP   (2004-01-14 07:49) [8]

А если файлик сделать типизированным? Тогда можно искать Seek`ом
Или файл содает сторонняя программа?


 
Романов Р.В.   (2004-01-14 07:55) [9]

а) Писать последнюю строку в отдельный файл
б) Читать X байт с конца файла и искать в этом буфере последнюю строку.


 
Babay   (2004-01-14 08:12) [10]

можно так попробовать
у меня файлик размром 3.69 Мб читался довольно быстро
с частотой 1 сек. А с частотой 0.3 сек писал внего строку(тем же принципом) и всегда получал последнюю.
(хотя это решение не панацея)

Var sl:TStringList;
begin
sl:=TstringList.Create;
sl.LoadFromFile("c:\temp.txt");
ListBox1.items.add(sl.Strings[sl.Count-1]);// это последняя строка
sl.Free;


 
sniknik   (2004-01-14 08:36) [11]

на 4х мб. может быть, а что будет когда файл будет 400 мб.?

нет лутше читать не текстовый фай а открывать как бинарный, читать последний блок и нужную вычленять строку. это будет одинаково на любом размере.

то User
ты знаеш что такое текстовый файл? сможеш реализовать (или хотя бы попытатся)? если начнеш приводи получившийся код, поправим если не так.


 
alex_***   (2004-01-14 09:05) [12]

>[7] И вероятнее всего этим методом он не получит не одной строки

Это почему? Seek на конец, не доходя х байт до Eof (примерную длину строки в логе он наверно знает) в этом буфере отыскать последнюю строку. Это, наверно, быстрее будет чем весь файл зачитывать.


 
Anatoly Podgoretsky   (2004-01-14 09:11) [13]

alex_*** © (14.01.04 09:05) [12]
Во первых это уже другой алгоритм, но даже так, ты предложил по переводу строки, интересно вот встретил ты последний перевод строки и где последнея строка? До него после него, еще где то?


 
alex_***   (2004-01-14 09:18) [14]

Это зависит от формата лога - каким символом он заканчивается. Для конкретного лога можно настроить.


 
Babay   (2004-01-14 09:39) [15]

Согласен с sniknik © (14.01.04 08:36) [11]
думаю автору вопроса следует уточнить формат файла(в смысле длина строки (постоянная, непостоянная) и т.д), а так же его возможную длинну и предпологаемую частоту обновления.


 
User   (2004-01-14 10:34) [16]

Уточняю мою задачу. написан мною бот для чата, который инфу берет из лога, т.е. команды ловит по средствам проверки последней записи в сообщений в логе.
длина строки известна лишь очень примерная. попробую через seek
сделать. может получится...
только подскажите как открыть файл в бинарном режиме ?
И насколько это быстрее будет чем построчное чтение? Буден ли реальный прирост скорости?
з.ы.
Спасибо всем ответившим!


 
Dred2k   (2004-01-14 11:52) [17]

> длина строки известна лишь очень примерная

В чем проблема - не понятно. Seek-ом перемещайся в (конец - 65535), смело читай 64K и ищи перевод строки от конца буфера. Думаю, строка больше этого размера тебе не встретится (хотя и это можно предусмотреть и "подчитать" еще данных). Ну а чтение 64K по времени - не заметишь...


 
Serginio666   (2004-01-14 17:22) [18]

Посмотри http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019
Там есть TTextBackReader


 
User   (2004-01-14 18:45) [19]

Ответ получен, Спасибо всем!
:)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.01.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
1-83156
Igorok
2004-01-15 10:57
2004.01.26
TLabel


1-83173
cobby
2004-01-15 02:43
2004.01.26
получить текущую ширину popupmenu


1-83206
Sirus
2004-01-14 11:37
2004.01.26
Две формы в DLL и один TDataModule на двоих....


14-83245
Jel
2004-01-06 14:10
2004.01.26
Где лучше хранить настройки программы?


1-83203
sbuffoon
2004-01-14 03:31
2004.01.26
размер exe-файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский