Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.21;
Скачать: CL | DM;

Вниз

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

 
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, так как
>последнии два тоже конец строки

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



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

Текущий архив: 2002.03.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
4-67049
valery_f
2002-01-21 12:36
2002.03.21
Multilanguage, Unicode...


14-66967
McSimm
2002-02-05 11:51
2002.03.21
Еще задачка. Почему нельзя казнить.


1-66852
Ig
2002-03-03 21:51
2002.03.21
Как поковыряться в DCU-файле?


3-66734
gegc
2002-02-20 09:37
2002.03.21
Как и чем создать DBF чтобы он открывался в экселе и аксесе И чтобы руссие буквы были похожи на русские буквы? (BDE не предлагать!)


3-66766
AlValK
2002-02-21 10:04
2002.03.21
Где найти TDBGrid с вертикальным расположением записей?