Как запустить файл lua

Обновлено: 07.07.2024

Библиотека ввода-вывода Lua используется для чтения и обработки файлов. Разделены на простой режим (такой же, как C) и полный режим.

  • Простая модель имеет текущий входной файл и текущий выходной файл и предоставляет операции, связанные с этими файлами.
  • Полная модель реализована с использованием внешнего дескриптора файла. Он определяет все файловые операции как методы обработки файлов в объектно-ориентированной форме.

Простой режим больше подходит для выполнения простых файловых операций. Но при выполнении некоторых расширенных операций с файлами простой режим оказывается неадекватным. Например, для таких операций, как одновременное чтение нескольких файлов, больше подходит полный режим.

Оператор операции с открытым файлом выглядит следующим образом:

Режим описание
r Чтобы открыть файл только для чтения, файл должен существовать.
w Откройте файл только для записи.Если файл существует, длина файла сбрасывается до 0, то есть содержимое файла исчезает. Если файл не существует, создайте файл.
a Откройте файл только для записи в режиме добавления. Если файл не существует, он будет создан.Если файл существует, записанные данные будут добавлены в конец файла, то есть исходное содержимое файла будет сохранено. (Символ EOF зарезервирован)
r+ Чтобы открыть файл в режиме чтения-записи, файл должен существовать.
w+ Откройте файл, доступный для чтения и записи.Если файл существует, длина файла сбрасывается до нуля, то есть содержимое файла исчезает. Если файл не существует, создайте файл.
a+ Подобен a, но этот файл доступен для чтения и записи.
b Двоичный режим, если файл является двоичным файлом, вы можете добавить b
+ Знак указывает, что файл можно читать или писать

Простой режим

В простом режиме используется стандартный ввод-вывод или текущий входной файл и текущий выходной файл.

Ниже приведен код файла file.lua, файл, с которым нужно работать, - test.lua (если у вас его нет, вам нужно создать файл), код выглядит следующим образом:

Выполнив приведенный выше код, вы обнаружите, что первая строка информации в файле test.ua выводится, а комментарий lua добавляется к последней строке файла. Например, вот что я вывожу:

В приведенном выше примере мы использовали метод io. "X", где мы не брали параметры в io.read (), и параметр может быть одним из следующих:

Режим описание
"*n" Прочтите число и верните его. Пример: file.read ("* n")
"*a" Прочитать весь файл с текущей позиции. Пример: file.read ("* a")
«* l» (по умолчанию) Прочтите следующую строку и верните ноль в конце файла (EOF). Пример: file.read ("* l")
number Возвращает строку с указанным количеством символов или возвращает ноль, если EOF. Пример: file.read (5)

Другие методы io:

  • io.tmpfile():Возвращает временный дескриптор файла, файл открывается в режиме обновления и автоматически удаляется при завершении программы.
  • io.type(file): Проверьте, является ли obj пригодным для использования дескриптором файла
  • io.flush(): Записать все данные из буфера в файл
  • io.lines(optional file name): Верните итеративную функцию, каждый вызов получит строку содержимого в файле, когда он достигнет конца файла, он вернет ноль, но файл не будет закрыт

Полный режим

Обычно нам нужно обрабатывать несколько файлов одновременно. Нам нужно использовать file: function_name вместо метода io.function_name. В следующем примере показано, как обрабатывать один и тот же файл одновременно:

Выполнив приведенный выше код, вы обнаружите, что первая строка информации в файле test.ua выводится, а комментарий lua добавляется к последней строке файла. Например, вот что я вывожу:

Параметры чтения соответствуют простому режиму.

  • "set": начать с начала файла
  • "cur": начать с текущей позиции [по умолчанию]
  • "конец": начать с конца файла
  • смещение: по умолчанию 0

Без параметров file: seek () возвращает текущую позицию, file: seek ("set") указывает на начало файла, file: seek ("end") находит до конца файла и возвращает размер файла.

file:flush(): Записать все данные из буфера в файл

io.lines(optional file name): Откройте указанное имя файла в режиме чтения и верните итеративную функцию. Каждый вызов будет получать строку содержимого в файле. Когда он достигнет конца файла, он вернет nil и автоматически закроет файл.
Если параметр отсутствует, io.lines () <=> io.input (): lines (); считывает содержимое устройства ввода по умолчанию, но не закрывает файл при конец, например

В следующем примере метод seek используется для поиска 25-й позиции снизу файла и используется параметр * a метода чтения для чтения всего файла с текущей позиции (25-я позиция снизу).

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

В этой статье, с помощью простой программы, я хочу показать пример встраивания Lua в ваш проект.

Примеров программ, которые используют Lua достаточно много. Далеко не полный список программ, использующих Lua, можно посмотреть здесь Lua Wiki и здесь Wikipedia

Я приведу пример простой программы, которая принимает в качестве аргументов путь к директории, перечисляет файлы и подкаталоги, передает их в скрипт. Скрипт, с помощью регулярных выражений ищет соответствие в путях, передаваемых файлов и, если находит, переименовывает файл согласно определенным правилам.

Пример я создавал в Visual Studio под Windows. Несмотря на это, приведенный код, за исключением нескольких функций (перечисление файлов, переименование файла), специфичных для Windows, после небольшой адаптации будет работать и на других платформах, т.к. Lua является кроссплатформенным языком сценариев.

Начнем с того, что посетим официальный сайт и скачаем Lua для своей платформы. Для Windows подойдет вот этот архив, включающий в себя библиотеки линковщика, динамические библиотеки и заголовочные файлы Lua.

Распаковываем, указываем в настройках Visual Studio пути к заголовочным файлам и библиотекам линковщика (Tools -> Options -> Projects and Solutions -> VC++ Directories).

  • Добавление в проект заголовочных файлов и библиотеки компоновщика
  • Инициализация виртуальной машины Lua
  • Реализация и регистрация экспортируемых функций

Почему extern «C»? Lua написан на ANSI C, если попытаться включить файлы без extern «C» то мы получим множество ошибок, таких как:

unresolved external symbol "char const * __cdecl lua_tolstring(struct lua_State *, int ,unsigned int *)" (?lua_tolstring@@YAPBDPAUlua_State@@HPAI@Z)

Это вызвано тем, что соглашения о вызовах в C отличаются от соглашений в C++.

Не забудем подключить библиотеку линковщика:

Теперь необходимо объявить и инициализировать экземпляр Lua интерпретатора.

int _tmain( int argc, _TCHAR* argv[])
// Инициализируем экземпляр
g_LuaVM = lua_open();
.
// Закрываем
lua_close(g_LuaVM);
>

Теперь нам необходимо объявить и реализовать две функции, которые будут вызываться из Lua. Первая будет искать соответствие имени файла регулярному выражению:

Вторая — переименовывает файл:

Остановимся подробнее на реализации второй:

// В качестве параметров принимает текущий путь к файлу и новое имя файла
// В случае успеха возвращает 1, иначе 0
int LuaRenameFile(lua_State *luaVM)
// Получаем число переданных из Lua скрипта аргументов
int argc = lua_gettop(luaVM);

// Если аргументов меньше двух - возвращаем ошибку
if (argc < 2)
cerr << "RenameFile - wrong number of arguments!" << endl;
// Вернем 0 в Lua скрипт
lua_pushnumber(luaVM, 0);

// Количество возвращаемых значений
return 1;
>

// Проверяем типы аргументов, если это не строки
// возвращаем 0 (признак ошибки)
if (!lua_isstring(luaVM, 1) || !lua_isstring(luaVM, 2))
cout << "RenameFile - invalid arguments!" << endl;
lua_pushnumber(luaVM, 0);

// Количество возвращаемых значений
return 1;
>

// Получаем значение первого аргумента, путь к файлу
// Обратите внимание - индекс первого элемента - 1, а не 0, как принято в С++
string strSource = lua_tostring(luaVM, 1);
// Получаем значение второго аргумента, новое имя файла
string strDestination = lua_tostring(luaVM, 2);

strDestination = strSource.substr(0, strSource.rfind('\\') + 1) + strDestination;

int nResult = ( int )::MoveFileEx(strSource.c_str(), strDestination.c_str(), MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH);

// Возвращаем в Lua скрипт результат выполнения MoveFileEx
lua_pushnumber(luaVM, nResult);

// Количество возвращаемых значений
return 1;
>

Как видно — ничего сложного: проверяем количество переданных аргументов, проверяем тип аргументов, извлекаем, выполняем переименование файла и возвращаем результат.

Теперь нам необходимо дать Lua знать, о экспортируемых функциях, делается это просто:

lua_register(g_LuaVM, "RenameFile", LuaRenameFile);
lua_register(g_LuaVM, "MatchString", LuaMatchString);

RenameFile и MatchString это имена функций, которые будут «видны» в скрипте.

Создадим скрипт, выполняющий всю работу:

-- Вызывается для обработки имени файла
-- В качестве параметра передается полный путь к файлу
-- и да, -- это комментарии в Lua
function onFileFound(fileName)
patt = MatchString('103(5).txt', fileName)

-- Если совпадение найдено patt будет содержать
-- найденно совпадение - (8)
-- иначе nil
if patt

= nil then
-- Переименовываем файл, заменяя 103 на XXX
-- Пример: было 103180998.txt, станет XXX180858.txt
RenameFile(fileName, 'XXX' .. patt .. '.txt')
end
end

Чтобы совсем стало понятно, привожу кусок кода, который вызывает эту функцию

// Переместить на начало стека функцию onFileFound
lua_getglobal(g_LuaVM, "onFileFound");
// Поместить следующим элементом в стек путь к найденному файлу (fileName в скрипте)
lua_pushstring(g_LuaVM, strFilePath.c_str());

// Вызвать функцию onFileFound
if (lua_pcall(g_LuaVM, 1, 0, 0) != 0)
// Проверить возвращенное значение,
// если это не 0, сообщить об ошибке
// lua_tostring(g_LuaVM, -1) содержит описание ошибки
cerr << "Error calling function onFileFound: " << lua_tostring(g_LuaVM, -1) << endl;
>

Осталось только загрузить скрипт из нашей программы:

BOOL LoadScript()
// Получение полного пути к скрипту
CHAR szScriptPath[1024] = ;
GetModuleFileName(NULL, szScriptPath, _countof(szScriptPath) - 1);
TCHAR *szSlashPos = strrchr(szScriptPath, '\\');
if (szSlashPos != NULL)
szScriptPath[szSlashPos - szScriptPath + 1] = '\0';
>
strcat_s(szScriptPath, _countof(szScriptPath), _T("script.lua"));

// Загружаем скрипт
int s = luaL_loadfile(g_LuaVM, szScriptPath);

// Если результат загрузки не 0 - произошла ошибка
// lua_tostring(g_LuaVM, -1) содержит описание ошибки
if (s != 0)
cout << "Error while loading script file!" << endl << "Error: " << lua_tostring(g_LuaVM, -1) << endl;

// Выполняем крипт
s = lua_pcall(g_LuaVM, 0, LUA_MULTRET, 0);

Как видно встраивание Lua скриптинга в программу является, по сути, тривиальной задачей и вместе с тем дает широкое поле для творчества.

Ниже приведен список ресурсов, на которых можно почитать о Lua более подробно.

Установка lua это вопрос, который возникает достаточно часто. Что, вообще-то, достаточно удивительно, потому как установка lua на самом деле, крайне проста и понятна. Можно даже сказать, что там вообще нечего делать. Но, раз уж такие вопросы возникают, давайте немного поговорим об установке Lua.

Установка Луа. Скачиваем

Установка Луа. Компиляция.

  1. Запускаем Visual Studio
  2. Выполняем Tools->Visual Studio Command Prompt
  3. Переходим в папку с луа, в директорию etc. Вот так: cd D:/mylibs/lua-5.1.4
  4. запускаем скрипт компиляции луа: etc/luavs.bat
  5. Мы получили нужны нам файлы lua.exe и luac.exe

Второй способ без запуска Visual Studio:

Установка Луа. Доступ

Установка Луа. Статическая линковка.

Установка Луа. Проверка.

Проверим, всё ли работает. Создаём новый проект (я сделал консольный проект win32). Дописываем инклюды луа:

и доделываем сам main():

В настройки линковщика (Project/Properties/Linker/Input/Addition Dependencies) не забываем добавить нашу библиотеку (lua.lib для релиза и lua-debug.lib для дебага). Компилируем. Создаём тестовый файлик с луа-скриптом:

На этом наш урок завершён. Теперь у вас есть собранные версии дебаг- и релиз- версий луа, собранные для статической компиляции и вы можете без каких-либо проблем использовать их в ваших проектах.

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

Автор, спасибо, хорошая статья, всё работает!

Не за что Очень рад, что у Вас всё получилось!

Что говорит? Какие ошибки?

Спасибо гуглу, за то, что я смог повторить то же самое в xcode.

Василий подскажи сайт где описано как подключить lua к xcode. А то ничего толкового найти не могу.

А как на счет компиляции LUA ? Будут статьи?

Папку с lua распаковал в диск С

Setting environment for using Microsoft Visual Studio 2010 x86 tools.

c:\program files\microsoft visual studio 10.0\vc\bin>cd C:/lua-5.1.4

C:\lua-5.1.4\etc>cd C:/lua-5.1.4/etc/luavs
Системе не удается найти указанный путь.

C:\lua-5.1.4\etc>cd src
Системе не удается найти указанный путь.

C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUIL
D_AS_DLL l*.c
l*.c
c1 : fatal error C1083: Не удается открыть файл источник: l*.c: Invalid argument

C:\lua-5.1.4\etc>del lua.obj luac.obj
Не удается найти C:\lua-5.1.4\etc\lua.obj

C:\lua-5.1.4\etc>if exist lua51.dll.manifest mt /nologo -manifest lua51.dll.mani
fest -outputresource:lua51.dll;2

C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUIL
D_AS_DLL lua.c
lua.c
c1 : fatal error C1083: Не удается открыть файл источник: lua.c: No such file or
directory

C:\lua-5.1.4\etc>if exist lua.exe.manifest mt /nologo -manifest lua.exe.manifest
-outputresource:lua.exe

C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE l*.c print
.c
l*.c
c1 : fatal error C1083: Не удается открыть файл источник: l*.c: Invalid argument

C:\lua-5.1.4\etc>del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathl
ib.obj loslib.obj ltablib.obj lstrlib.obj loadlib.obj
Не удается найти C:\lua-5.1.4\etc\lua.obj

C:\lua-5.1.4\etc>link /nologo /out:luac.exe *.obj
LINK : warning LNK4001: не указаны объектные файлы; использованы библиотеки
LINK : warning LNK4068: параметр /MACHINE не указан; принимается по умолчанию на
X86
LINK : fatal error LNK1561: точка входа должна быть определена

C:\lua-5.1.4\etc>if exist luac.exe.manifest mt /nologo -manifest luac.exe.manife
st -outputresource:luac.exe

C:\lua-5.1.4\etc>del *.obj *.manifest
Не удается найти C:\lua-5.1.4\etc\*.obj


Каждому пользователю полезно узнать, как открыть файл lua, особенно если возникла необходимость просмотреть документ такого типа.

Расширение LUA

Расширение файла LUA связано с языком сценариев Lua, который используется для увеличения возможностей многих различных приложений и компьютерных игр. Язык сценариев Lua также используется в различных промышленных программах, таких как Photoshop Lightroom от Adobe Systems.

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

Документы с таким расширением представляют собой исходный код и скрипт, который определяет действия, выполняемые ПК при запуске программ и приложений. Скрипт поддерживает автоматизированные процессы для операционных систем и приложений, которые на них работают.

Файлы исходного кода компактны, чтобы избежать ненужного увеличения размера приложения. Документы LUA скомпилированы в виде архива, созданного утилитой TAR. TAR – это UNIX-утилита, которая используется для упаковки нескольких элементов в одну папку.

Хотя TAR на самом деле является инструментом архивации, он также известен как архиватор с нулевым сжатием. Несколько документов могут быть заархивированы с использованием формата TAR, но они не сжимаются, как в ZIP.

Как открыть элементы в формате LUA

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

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

На ПК под управлением Windows можно открывать такие документы с помощью любого текстового редактора, такого как Блокнот или WordPad. Следует просто щелкнуть правой кнопкой мыши на иконку и выбрать «Открыть с помощью» в раскрывающемся меню.

В подменю целесообразно нажать на текстовый редактор, который можно использовать, или нажать «Обзор», если программа отсутствует в списке.

Достаточно выбрать приложение из списка установленных программ, поставить галочку в поле «Всегда использовать эту программу, чтобы открыть файл этого типа», а затем нажать «ОК». Всякий раз, когда есть необходимость открыть элемент с расширением LUA, он автоматически будет использовать выбранный текстовый редактор в качестве приложения по умолчанию.

Если элемент LUA содержит исходный код и сценарии для игровых приложений, используемых с Windows, его можно открыть с помощью набора дополнений World of Warcraft от Blizzard Entertainment или World of Warcraft AddOn Studio.

Если файл содержит исходный код и сценарии для игр, совместимых с Mac OS X, допускается использование Rovio Mobile Angry Birds, который доступен на веб-сайте Rovio или в комплекте дополнений World of Warcraft Interface от Blizzard Entertainment.

Открыть документ с подсветкой кода

Конечно, можно использовать любой текстовый редактор для просмотра элементов с таким типом. Но лучше использовать редактор с подсветкой кода. Один из них – это инструмент Sublime Text. Но можно использовать и Notepad ++.

На изображении ниже есть возможность увидеть разницу между программой с подсветкой кода и классическим блокнотом.

Notepad ++

Таким образом, можно заметить, что некоторые ключевые слова показаны в определенных цветах. Так код стает более читабельным и можно наглядно просмотреть его структуру.

Кроме того, в программе видно количество строк. Это особенно полезно, когда в журнале ошибок появляется оповещение: «строка 23 в example.lua». Отыскать проблему можно намного быстрее.

Еще одна полезная функция: если дважды щелкнуть слово, оно выделяется во всем документе.

Подсветка кода

Опция используется для проверки написания и при просмотре игрового кода, когда есть смысл отыскать, где используется функция (например, SILVER_BIRDCAGE).

Во время поиска нужно учитывать, что код чувствителен к регистру, то есть: Silver_birdcage, silver_birdcage и SILVER_BIRDCAGE – это не одно и то же.

Другой вариант поиска, но в большем масштабе, это «Найти в файлах» (комбинация клавиш Ctrl + Shift + F). Этот вариант позволяет искать что-то во всех документах указанной папки. Почему это полезно?

Допустим, необходимо добавить функцию «onattackother» к своему персонажу или монстру и надлежит получить лучший пример того, как и что можно сделать.


Далее просто нужно дважды щелкнуть на строку, чтобы открыть соответствующий файл и просмотреть функцию.

Следовательно, для программистов намного лучше использовать программу с подсветкой синтаксиса.

Проблемы с открытием файла

Если не получается открыть документ LUA, нелишне просмотреть перечисленные возможные причины и выяснить точную причину этой ошибки:

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

Слишком много пользователей испытывают трудности с открытием файлов с расширением LUA. Поэтому важно внимательно искать причину возникшей ошибки.

Заключение

Элементы с расширением LUA очень популярны и существует много способов их открыть: используя любой текстовый редактор (WordPad, Блокнот, TextEdit) или с помощью редакторов подсветкой синтаксиса (Sublime Text, Notepad ++).

Читайте также: