Форум: "Основная";
Текущий архив: 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, так как
>последнии два тоже конец строки
Зачем же все до мелочей раскрывать - лишите творчества (хотя, и глюков тоже, наверное, лишите):)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c