2016-04-25 2 views
1

У меня возникли проблемы с печатью таблицы в файл с помощью lua (и я новичок в lua).Как сохранить таблицу в файле от Lua

Вот код I found here, чтобы распечатать таблицу;

function print_r (t) 
    local print_r_cache={} 
    local function sub_print_r(t,indent) 
     if (print_r_cache[tostring(t)]) then 
      print(indent.."*"..tostring(t)) 
     else 
      print_r_cache[tostring(t)]=true 
      if (type(t)=="table") then 
       for pos,val in pairs(t) do 
        if (type(val)=="table") then 
         print(indent.."["..pos.."] => "..tostring(t).." {") 
         sub_print_r(val,indent..string.rep(" ",string.len(pos)+8)) 
         print(indent..string.rep(" ",string.len(pos)+6).."}") 
        elseif (type(val)=="string") then 
         print(indent.."["..pos..'] => "'..val..'"') 
        else 
         print(indent.."["..pos.."] => "..tostring(val)) 
        end 
       end 
      else 
       print(indent..tostring(t)) 
      end 
     end 
    end 
    if (type(t)=="table") then 
     print(tostring(t).." {") 
     sub_print_r(t," ") 
     print("}") 
    else 
     sub_print_r(t," ") 
    end 
    print() 
end 

Я понятия не имею, где команда «печать» идет, я бег этого Lua кода из другой программы. Я хотел бы сохранить таблицу в файле .txt. Вот что я пробовал;

function savetxt (t) 
    local file = assert(io.open("C:\temp\test.txt", "w")) 
    file:write(t) 
    file:close() 
end 

Затем в функции print-r я повсюду менял «отпечаток» на «savetxt». Это не работает. Кажется, он никак не обращается к текстовому файлу. Может ли кто-нибудь предложить альтернативный метод?

У меня есть подозрение, что эта линия является проблемой;

local file = assert(io.open("C:\temp\test.txt", "w")) 

Обновление; Я пробовал редактирование, предложенное Diego Pino, но все равно безуспешно. Я запускаю этот сценарий lua из другой программы (для которой у меня нет источника), поэтому я не уверен, где может быть каталог по умолчанию выходного файла (есть ли способ получить это программно?). Возможно ли, что, поскольку это вызвано из другой программы, что-то блокирует вывод?

Обновление № 2; Похоже, проблема с этой линии:

local file = assert(io.open("C:\test\test2.txt", "w")) 

Я попытался изменить его «C: \ Temp \ test2.text», но это не сработало. Я довольно уверен, что это ошибка на данный момент. Если после этого прокомментировать любую строку (но оставьте эту строку), она все равно не удастся, если я прокомментирую эту строку (и любые строки «файла»), тогда код запускается. Что может вызвать эту ошибку?

+0

В качестве последующего вопроса; где файлы создаются, если я не укажу каталог (что, кажется, было сделано во всех учебниках)? – FraserOfSmeg

+0

http://lua-users.org/wiki/SaveTableToFile – hjpotter92

+0

'io.open (« C: \ temp \ test.txt »,« w »)' открывается не так, как вы думаете. – moteus

ответ

2

Я понятия не имею, где команда «печать» переходит к,

печати() вывод идет по умолчанию выходного файла, вы можете изменить это с io.output ([файл]), см Lua для получения подробной информации о запросе и изменении вывода по умолчанию.

где делать-файлы создаются, если не указать каталог

Обычно он приземлится в текущем рабочем каталоге.

2

Ваш print_r функция распечатывает таблицу до stdout. Вы хотите распечатать вывод файла print_r. Измените функцию print_r, поэтому вместо того, чтобы печатать на stdout, она выводит на экран дескриптор файла. Возможно, самый простой способ сделать это, чтобы передать дескриптор файла в print_r и переписать print функцию:

function print_r (t, fd) 
    fd = fd or io.stdout 
    local function print(str) 
     str = str or "" 
     fd:write(str.."\n") 
    end 
    ... 
end 

Остальная часть print_r не нуждается в каких-либо изменений.

Позже в savetxt позвоните print_r, чтобы распечатать таблицу в файл.

function savetxt (t) 
    local file = assert(io.open("C:\temp\test.txt", "w")) 
    print_r(t, file) 
    file:close() 
end 
0

1.

require("json") 
result = { 
    "ip"]="192.168.0.177", 
    ["date"]="2018-1-21", 
} 

local test = assert(io.open("/tmp/abc.txt", "w")) 
result = json.encode(result) 
test:write(result) 
test:close() 


require("json") 
local test = io.open("/tmp/abc.txt", "r") 
local readjson= test:read("*a") 
local table =json.decode(readjson) 
test:close() 
print("ip: " .. table["ip"]) 

2.Another путь: http://lua-users.org/wiki/SaveTableToFile

Сохранить таблицы в файл функции table.save (TBL, имя файла)

нагрузки Таблица из файла function table.load (sfile)

Смежные вопросы