Recommended Posts

Здравствуйте, гуру программирования, модераторы, игроки, гости. (нужное подчеркнуть)

 

Стало мне вдруг надо написать программу, в коде которой требовалось бы прочитать файл. Использую такой код:

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 не мог понять, в чём ошибка. Или есть что-то вроде !=, но пишется по-другому?

Изменено пользователем Andrey26780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
19 минут назад, MrArliton сказал:
  Показать содержимое

 

 

Эмм... ладно... отсутствие ответа - тоже ответ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делал открытие файла через 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

 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, Andrey26780 сказал:

А если мне надо читать не строки, а символы, то как?

Скорее всего надо прочитать сперва строку, затем, уже выполнять подстрочный поиск по символам. Вот здесь можешь посмотреть команды и примеры для работы со строками. http://www.lua.ru/doc/5.4.html

Даже если у тебя все данные в файле пишутся в одну строку, то все же в этом файле будет хоть одна эта строка. Мм... не совсем складно написал но думаю смысл ты понял :). Так вот, с этой строкой ты и сможешь работать читая символы из нее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Полностью код программы увидеть можно?

Изменено пользователем Netins

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

*пока всё

Изменено пользователем Andrey26780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Меня смущает этот цикл:

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 удобнее и избавляет от лишних хлопот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 17.08.2016 в 16:38, Andrey26780 сказал:

Да, спасибо, io помог. Но уже отпала необходимость в чтении файла :D

Слушай, ты все еще вояешь эту систему? Просто к вайпу многие города, в том числе и наш, хотели бы сделать действующий интернет. Идея с сервером хороша.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.