Andrey26780 17 Жалоба Опубликовано 13 августа, 2016 (изменено) Здравствуйте, гуру программирования, модераторы, игроки, гости. (нужное подчеркнуть) Стало мне вдруг надо написать программу, в коде которой требовалось бы прочитать файл. Использую такой код: sl = fs.open("бла-бла/бла-бла.txt", 'r') str = "" if(sl == nil) then gpu.setForeground(0xFF0000) term.write("FAIL: Не получается открыть файл для чтения.") gpu.setForeground(0xFFFFFF) while true do end end for symb in sl:read(1) do if(not(symb == '\n')) then str = str + symb end end Вот только незадача: /mns.lua:28: attempt to call a field 'read' (a nil value) stack traceback: /mns.lua:28: in main chunk (...tail calls...) Почему так? ведь sl не равен nil а соответственно откуда взяться ошибке a nil value ? Прошу сильно не кидать в меня помидорами,так как не очень знаком с Lua. Лучше другие языки. ЗЫ: после того, что я привык, что в других языках для обозначения выражение1 не равно выражение2 надо писать vyrasheniye1 != vyrasheniye2 а в Lua - not(vyrasheniye1 == vyrasheniye2) Из-за этого я минут 15 не мог понять, в чём ошибка. Или есть что-то вроде !=, но пишется по-другому? Изменено 13 августа, 2016 пользователем Andrey26780 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
kotttt 62 Жалоба Опубликовано 13 августа, 2016 Темы дублировать не надо! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 14 августа, 2016 У меня как-то дубликация произошла при изменении темы. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 15 августа, 2016 Неужели никто не знает? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
MrArliton 5 Жалоба Опубликовано 15 августа, 2016 (изменено) Скрытый текст Изменено 15 августа, 2016 пользователем MrArliton Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 15 августа, 2016 19 минут назад, MrArliton сказал: Показать содержимое Эмм... ладно... отсутствие ответа - тоже ответ... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Jenko 7 Жалоба Опубликовано 15 августа, 2016 Я делал открытие файла через io.open. Все нормально работает, файлы открываются и читаются данные. Возможно мой способ и не лучший, но он работает. А так как я человек далекий от программирования то мне этого достаточно :). Вот пример части кода одной из моих программ: Скрытый текст local fs = require("filesystem") f = io.open("Log.txt","r"); rezscan = "Название корабля: "..name.." X: "..x.." Y: "..y.." Z: "..z.."" local fr=2 -- Перебирает строки файла, сравнивает с содержимым переменной "rezscan" for line in f:lines() do -- Если в файле уже имеется точно такая строка то ничего не пишем if line == rezscan then fr = 1 print ("Такой корабль уже был обнаружен") end end -- Если ни одна из строк в файле не соответствует полученным данным, записывает их в файл if fr == 2 then f = io.open("Log.txt","a"); f:write(rezscan.."\n") print ("Найден новый корабль!") end f:flush() f:close() end 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 16 августа, 2016 А если мне надо читать не строки, а символы, то как? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Jenko 7 Жалоба Опубликовано 16 августа, 2016 10 часов назад, Andrey26780 сказал: А если мне надо читать не строки, а символы, то как? Скорее всего надо прочитать сперва строку, затем, уже выполнять подстрочный поиск по символам. Вот здесь можешь посмотреть команды и примеры для работы со строками. http://www.lua.ru/doc/5.4.html Даже если у тебя все данные в файле пишутся в одну строку, то все же в этом файле будет хоть одна эта строка. Мм... не совсем складно написал но думаю смысл ты понял . Так вот, с этой строкой ты и сможешь работать читая символы из нее. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Netins 6 Жалоба Опубликовано 17 августа, 2016 (изменено) Полностью код программы увидеть можно? Изменено 17 августа, 2016 пользователем Netins Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 17 августа, 2016 (изменено) 29 минут назад, Netins сказал: Полностью код программы увидеть можно? Нетинс привет! я твой подписчик! --MineNet --Andrey Antonenko 2016 --Minecraft Network. ДАЛАД!? --*Специально для моего любимого сервера Dreamfinity* --Сервер. Здесь будет храниться ваш сайт. Нужно мощное железо, конечно. Или не очень, если вы не рассчитываете на 100 подключённых клиентов. local component = require("component") local term = require("term") local gpu = component.gpu local fs = component.filesystem term.clear() gpu.setForeground(0xFFFF00) print("MineNet.Server (создатель Andrey26780)") term.setCursorBlink(false) term.setCursor(1, 2) gpu.setForeground(0xFF00FF) term.write("Загружаю сайт...") if(fs.exists("minenet")) then if(fs.exists("minenet/mnssite.mns")) then sl = fs.open("minenet/mnssite.mns", 'r') str = "" if(sl == nil) then gpu.setForeground(0xFF0000) term.write("FAIL: Не получается открыть файл для чтения.") gpu.setForeground(0xFFFFFF) while true do end end for symb in sl:read(1) do --Отсюда print("Прочитан символ " + symb) if(symb == '\n') then str = str + symb end end --До этой строчки term.setCursor(1, 3) gpu.setForeground(0x00FF00) term.write("Найден сайт: ") print(str) if(fs.exists("minenet/" + str)) then print("Папка с сайтом сущестует.") else gpu.setForeground(0xFF0000) term.write("FAIL: не существует папка сайта ") term.write(str) gpu.setForeground(0xFFFFFF) while true do end end else gpu.setForeground(0xFF0000) term.write("FAIL: не существует файла minenet/mnssite.mns") gpu.setForeground(0xFFFFFF) while true do end end else gpu.setForeground(0xFF0000) term.write("FAIL: не существует директории minenet") gpu.setForeground(0xFFFFFF) while true do end end *пока всё Изменено 17 августа, 2016 пользователем Andrey26780 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 17 августа, 2016 Всё, проблема решена, всем спасибо! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Netins 6 Жалоба Опубликовано 17 августа, 2016 Меня смущает этот цикл: for symb in sl:read(1) do read() возвращает строку или nil, а не функцию, поэтому for...in тут вряд ли подходит. Тут для чтения строки лучше подошел бы цикл while sym = sl:read(1) while sym ~= '\n' do str = str..sym sym = sl:read(1) end Проблема ещё и в том, что read после чтения двигает каретку, поэтому, чтобы лишний раз этого не делать, написал цикл именно таким образом. А вообще, согласен с Jenko, библиотека io удобнее и избавляет от лишних хлопот. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 17 августа, 2016 Да, спасибо, io помог. Но уже отпала необходимость в чтении файла Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
biryulin04 6 Жалоба Опубликовано 3 сентября, 2016 В 17.08.2016 в 16:38, Andrey26780 сказал: Да, спасибо, io помог. Но уже отпала необходимость в чтении файла Слушай, ты все еще вояешь эту систему? Просто к вайпу многие города, в том числе и наш, хотели бы сделать действующий интернет. Идея с сервером хороша. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Andrey26780 17 Жалоба Опубликовано 3 сентября, 2016 Да, а что? Я уже заканчиваю и с сервером, и отправителем... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wistaf 1 Жалоба Опубликовано 25 сентября, 2017 Проблема решена. Тема закрыта. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты