Есть несколько способов, это зависит от того, сколько информации вы имеете в своем распоряжении.
Если вы знаете длину последней прочитанной строки, вы можете выбрать самый простой подход:
# assume f is the File object
len = last_line_length
f.seek -len, IO::SEEK_CUR
Конечно, если вам не предоставят информацию, вещи станут немного менее приятными. Вы можете использовать тот же подход, что и выше, чтобы идти назад (по одному байту за раз), пока вы не нажмете маркер новой строки или не возьмете lineno
и не начнете читать с начала. Что-то вроде
lines = f.lineno
f.rewind
(lines - 1).times { f.gets }
Однако, насколько мне известно, не существует прямого механизма для go back 1 N
, где N
представляет линию.
Кроме того, вы должны знать, что, хотя вы можете писать в File.lineno
, это фактически не влияет на позицию в файле, а также ухудшает точность переменной для чтения после этой точки.