1 (2015-11-16 10:26:56 отредактировано GREEN_X5)

Тема: Корректно прервать цикл io.lines

Никак не могу разобраться с прерыванием io.lines, прошу помочь!
Написал функцию, её алгоритм - проверяет наличие файла по пути patch,
а). если его нет - возвращает 1.
б). если файл есть, перебирает строки, ищет строку с упоминанием pattern=NUMERIC, возвращает эту цифру.
Всё прекрасно работает, но файл может быть большой, незачем его весь шерстить, нашли паттерн и пора бы выскочить из цикла. И выскакивает, если поставить BREAK, вот только, похоже, файл остается открытым, или ешё какая-то катаклизма образуется. По-крайней мере последующий StringCrid:SaveToFile(patch) от vclua не может его переписать. Без BREAK, с полным перебором строк, записывает без проблем.
Как правильно написать функцию с досрочным выходом из цикла?

function parser(patch,pattern)
    local x=1
    local f=io.open(patch);
    if f then f:close() else return x end
  for line in io.lines(patch) do
    if string.find(line,pattern) then
    x= line:match(pattern..".-(%d+)");
        -- break ???
    end
  end
  return x
end

Или подскажите, как написать поиск только, например, в 5-ой строке файла?
Спасибо.

2

Re: Корректно прервать цикл io.lines

function parser(path, pattern)
    local f=io.open(path);
    if not f then  return "" end

    local line_num = 1
    local line_5 = ""
    for line in f:lines() do
        if line_num == 5 then
            line_5 = line
            break
        end
        line_num = line_num + 1
    end

    f:close()

-- обрабоатываем строку номер 5 из line_5

    message(line_5)

    return line_5
end

parser("C:\\обрабатываемый файл", "11")

3

Re: Корректно прервать цикл io.lines

Очередное спасибо! Работает корректно и быстрее моего варианта. )