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




Вниз

Как перейти на споледнюю строчку текстового файла и прочитать ее. 


Reals   (2002-03-06 16:15) [0]

Здравствуйте!
Подскажите пожалуйста, как перейти на последнюю строчку текстового файла и прочитать ее, не используя while not f.eof() do...
или без цикла все-таки нельзя?

Заранее благодарен!



Reals   (2002-03-06 16:17) [1]

Извините, не правильно код написал. Имелось ввиду:
while not Eof(f) do...



Alx2   (2002-03-06 16:18) [2]

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



Reals   (2002-03-06 16:25) [3]

А как вот найти последнюю строку? Мне не известно сколько там будет символов, мне нужно целую строку прочитать, с первого и по последний символ строки.
С использованием Seek(f,filezise(f)) я перехожу в конец файла.



MAxiMum   (2002-03-06 16:26) [4]

Самое простое, но, может быть, не самое эффективное в плане рапределения памяти.
Привожу код:
var FStrings: TStringList;
begin

FStrings := TStringList.Create;
FStrings.Lines.LoadFromFile("C:\MyFile.txt"); {загрузить в память}
ShowMessage(FStrings.Lines[FStrings.Count - 1]);
FStrings.Free; {Не забудь удалить из памяти}
Создай свой TStringList. Прочитай туда свои строки с помощью метода LoadFromFile. Искомая строка String



Alx2   (2002-03-06 16:28) [5]

Seek(f,filezise(f)-N) где N - почти от балды. Потом его можно будет уточнить. Читаем от filezise(f)-N до конца файла и ищем, начиная с конца, символ конца строки (#13, кажется или ее пара с #10).
Если его нашли, то то, что мы просмотрели и есть последняя строка. Если не нашли - читаем предыдущий кусок из файла размером N и снова ищем конец строки



Alx2   (2002-03-06 16:32) [6]

>MAxiMum (06.03.02 16:26)
Я думаю, речь идет об очень больших файлах.
Но даже в случае не очень больших цикл while not eof IMHO эффективнее и в плане памяти и скорости.



Третейский Судья   (2002-03-06 16:43) [7]

Собственно, просьба была без изспользования While ...
А посему вариант :
Functinon LastString(f: textfile):string;
var
StringToFind : string;
Begin
...
Repeat
Readln(f,StringToFind);
Result := StringToFind
Until EOF(f)
End;
Вроде как проходит



DieHard   (2002-03-06 16:45) [8]

А если файл нулевой длины? :)



Alx2   (2002-03-06 16:45) [9]

>Третейский Судья (06.03.02 16:43)
:)
Но хрен редьки не слаще



Reals   (2002-03-06 16:47) [10]

Вот, спасибо. Как я мог забыть с использованием Repeat Until. Вот это хороший выход.

Спасибо всем! Удачи!



Третейский Судья   (2002-03-06 16:52) [11]

>> DieHard © (06.03.02 16:45)
>> А если файл нулевой длины? :)

Там три точки после Begin, которые по идее предполагают и Assign и Reset в защищенном блоке ....



MBo   (2002-03-06 16:54) [12]

var fs:tfilestream;
i:integer;
s:string;
begin
fs:=tfilestream.create("e:\w.txt",fmOpenRead);
i:=max(0,fs.Size-255);
fs.position:=i;
setlength(s,fs.size-i);
fs.read(s[1],length(s));
fs.free;
i:=lastdelimiter(#10,s);
if i>0 then s:=copy(s,i+1,length(s)-i);
label1.caption:=s;



Anatoly Podgoretsky   (2002-03-06 16:58) [13]

Alx2 © (06.03.02 16:28)
Алгоритм надо немного модернизировать.

Читаем от filezise(f)-N до конца файла и ищем, начиная с конца,

Не с конца, а с конца -2, так как последнии два тоже конец строки



MBo   (2002-03-06 17:11) [14]

>последнии два тоже конец строки
не обязательно, но, конечно, надо на это проверять



Anatoly Podgoretsky   (2002-03-06 17:28) [15]

Конечно конец строки может отсутствовать, тогда сначала проверить, а потом искать начало
В принципе подобный алгоритм нужен только для действительно больших файлов, для меня это начинается со 100 мб
В других случаях Readln вполне нормальное решение.



Alx2   (2002-03-07 08:32) [16]

>Anatoly Podgoretsky © (06.03.02 16:58)
>Не с конца, а с конца -2, так как
>последнии два тоже конец строки

Зачем же все до мелочей раскрывать - лишите творчества (хотя, и глюков тоже, наверное, лишите):)




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




Наверх





Память: 0.74 MB
Время: 0.037 c
1-66856           Agent Smith           2002-03-05 14:51  2002.03.21  
SOS!


14-66991          lel                   2001-12-03 12:18  2002.03.21  
---|Ветка была без названия|---


6-66943           Igorok                2001-12-15 11:24  2002.03.21  
Как при ошибке коннекта перехватить окно


3-66764           Eva                   2002-02-21 13:17  2002.03.21  
Проблемы с Decision Cube, ваше мнение о нем


1-66838           alex125               2002-03-06 18:15  2002.03.21  
ошибка при вызове popupmenu