Forum Webscript.Ru

Программирование => Perl => Тема начата: Е. Перлов от 28 Января 2003, 18:47:14

Название: <чтение файла>
Отправлено: Е. Перлов от 28 Января 2003, 18:47:14
Подскажите, пожалуйста, как читать файл построчно начиная с конца, т.е. чтобы сначала читалась последняя строчка, потом предпоследня...?
Название: <чтение файла>
Отправлено: NeoNox от 28 Января 2003, 18:50:53
В массив потом perldoc -f reverse
Название: <чтение файла>
Отправлено: Е. Перлов от 28 Января 2003, 21:24:15
Чтение в массив - это как раз то, чего я хотел бы избежать, т.к. длина файла ничем не ограничена. Thank you anyway.
Название: <чтение файла>
Отправлено: NeoNox от 28 Января 2003, 21:27:17
Tak seek-om читай.
По кусочкам.
perldoc -f seek
Название: <чтение файла>
Отправлено: Е. Перлов от 29 Января 2003, 13:39:20
Смысле по одному байту? Ты не мог бы показать хотя бы схематический алгоритм, как это сделать?
Название: <чтение файла>
Отправлено: YA от 29 Января 2003, 14:05:13
Более подробно опиши задачу (формат файла, размер, что с ним надо делать).
Название: <чтение файла>
Отправлено: NeoNox от 29 Января 2003, 14:06:53
Схематический алгоритм укладывается в одной строке :)
Сколько поставишь-столько и будет.
Почитай еще perldoc -f sysread
Цитировать

       sysread FILEHANDLE,SCALAR,LENGTH
               Attempts to read LENGTH characters of data into variable SCALAR
               from the specified FILEHANDLE, using the system call read(2).
               It bypasses buffered IO, so mixing this with other kinds of
               reads, "print", "write", "seek", "tell", or "eof" can cause
               confusion because stdio usually buffers data.  Returns the num‐
               ber of characters actually read, 0 at end of file, or undef if
               there was an error.  SCALAR will be grown or shrunk so that the
               last byte actually read is the last byte of the scalar after
               the read.
Название: <чтение файла>
Отправлено: mike от 29 Января 2003, 15:00:47
Схематический алгоритм:
1) читаешь кусок файла с конца (допустим, последние 100Кб)
2) разбиваешь с помощью split /\\r?\\n/ на строки
3) первую строку не трогаешь (вдруг это окончание большей строки?), остальному массиву делаешь reverse (или просто читаешь с конца с помощью отрицательных индексов).
4) читаешь следующие 100 Кб с конца + в конец прикрепляешь первую строку
5) и т.д. с пункта 2.
Само собой, нужна грамотная проверка на окончание цикла :)

Кажется, так.