Чтение файла построчно в Lua

согласно документации Lua,file:read("*l") читает следующую строку, пропуская конец строки.

Примечание: - "*l": читает следующую строку, пропуская конец строки, возвращая ноль в конце файла. Это формат по умолчанию

эта документация правильно? Потому что file:read("*l") читает текущую строку, а не следующую строку или мое понимание неверно? Довольно запутанно...

1 ответов


Lua управляет файлами, используя ту же модель базовой реализации C (Эта модель используется также другими языками программирования, и она довольно распространена). Если вы не знакомы с этим способом просмотра файлов, терминология может быть неясной, действительно.

в этой модели файл представлен как поток байт имея так называемый текущая позиция. Текущая позиция является своего рода концептуальным указателем на первый байт в файле, который будет прочитано или написано далее операции ввода-вывода. Когда вы открываете файл для чтения, новый поток настраивается так, чтобы его текущая позиция была началом файла, т. е. текущая позиция "указывает" на первый байт в файле.

В Lua вы управляете потоками через так называемые ручки, которые являются своего рода посредниками для базовых потоков. Любая операция, выполняемая с помощью ручки, переносится на соответствующий поток.

Луа io.open открывает файл, связывает с ним поток C и возвращает дескриптор файла, представляющий этот поток:

local file_handle = io.open( "myfile.txt" ) -- file opened for reading

поэтому, если вы выполняете любую операцию, которая считывает некоторые байты (обычно интерпретируемые как символы, если вы работаете с текстовыми файлами), они считываются из потока, и для каждого байта читать текущая позиция потока продвигается на один, указывая каждый раз на далее байты читать.

документация Lua подразумевает эту модель. Таким образом, когда он говорит далее строка, это означает, что операция ввода будет считывать все символы в потоке начиная с текущей позиции пока не будет найден символ конца строки.

обратите внимание, что если вы смотрите на текстовые файлы как последовательность строк, вы можете быть введены в заблуждение, так как вы можете думать о "текущей строке" и "следующей строке". Это была бы модель более высокого уровня по сравнению с C модель. Нет" текущей строки " В C. В текстовых файлах C не более чем последовательность байтов, где некоторые специальные символы (символы конца строки) подвергаются некоторой специальной обработке (которая в основном зависит от реализации) и используются некоторыми стандартными функциями C как терминаторы строк, т. е. как метки для обнаружения при остановке чтения символов.

другим источником путаницы для новичков или людей, происходящих из языков более высокого уровня, является то, что в C, для исторической аварии, байты обрабатываются как символы (основной тип данных для обработки один байт char, которое является наименьшим числовым типом в C!). Поэтому для людей с фоном C естественно думать о байтах как о символах и наоборот.

хотя Lua является гораздо более высоким уровнем языка, чем C, его тесная связь с C (он был разработан, чтобы легко взаимодействовать с кодом C) делает его наследовать часть этого подхода c "байты как символы". На самом деле, например, строки Lua могут содержать произвольные байты и могут использоваться для обработки необработанных двоичных данных.