Главная страница
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.014 c
1-66918
None
2002-03-05 11:29
2002.03.21
Рисование поверх всех компонент.


3-66754
lvi
2002-02-21 14:34
2002.03.21
Люди помогите новичку задать значение переменной внутри процедуры в Interbase


14-66958
McSimm
2002-02-06 10:21
2002.03.21
Об оптимизации.


1-66812
Olfi
2002-03-06 18:44
2002.03.21
Как узнать, есть ли на строке символ


1-66898
Satrap
2002-03-04 17:43
2002.03.21
Вопрос по IShellFolder