Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将lua输出发送到非标准输出_C_Lua_Stdout - Fatal编程技术网

C 将lua输出发送到非标准输出

C 将lua输出发送到非标准输出,c,lua,stdout,C,Lua,Stdout,我有一个运行嵌入式Lua的c程序。现在,这只是一个你好的世界。不过,在继续之前,我希望能够将lua输出发送到stdout以外的其他地方,以便以某种方式对其进行操作。这是我的密码: #include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> int main() { lua_State *luaVM = luaL_newstate();

我有一个运行嵌入式Lua的c程序。现在,这只是一个你好的世界。不过,在继续之前,我希望能够将lua输出发送到
stdout
以外的其他地方,以便以某种方式对其进行操作。这是我的密码:

#include <stdio.h>

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main() {
    lua_State *luaVM = luaL_newstate();
    //char result[1024];

    if (luaVM == NULL) {
        printf("Error initializing lua!\n");
        return -1;
    }
    luaL_openlibs(luaVM);
    luaL_dostring(luaVM, "print(\"hello world!\")");
    //Somehow put the output into result

    //printf("%s\n%s\n", result, result);

    lua_close(luaVM);
    return 0;
}
#包括
#包括
#包括
#包括
int main(){
lua_State*luaVM=luaL_newstate();
//字符结果[1024];
if(luaVM==NULL){
printf(“初始化lua时出错!\n”);
返回-1;
}
luaL_openlibs(luaVM);
luaL_dostring(luaVM,“print(\“hello world!\”));
//以某种方式将输出转化为结果
//printf(“%s\n%s\n”,结果,结果);
lua_关闭(luaVM);
返回0;
}

例如,我想使用注释中的
result
,将lua代码的结果打印两次。这可以做到吗?

如果您的Lua代码将使用
print
输出内容,那么我想最简单的方法就是从Lua本身重新定义
print
。大概是这样的:

print_stdout = print -- in case you need the old behavior

print = function(...)
  for arg,_ in ipairs({...}) do
    -- write arg to any file/stream you want here
  end
end

这个答案可能会受到一些读者的批评,但首先请看一看我为这个答案专门准备的答案,并阅读前言为什么我选择这个解决方案

正如承诺的那样,我已将旧的Lua 5.1输出重定向补丁升级到最新版本。
此处提供了修补程序:和

补丁

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch
cd src  
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"
nm liblua-5.x.y-redirect.a | grep printf
nm liblua-5.x.y-redirect.a | grep fputs
nm liblua-5.x.y-redirect.a | grep fwrite
检查

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch
cd src  
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"
nm liblua-5.x.y-redirect.a | grep printf
nm liblua-5.x.y-redirect.a | grep fputs
nm liblua-5.x.y-redirect.a | grep fwrite
测试

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch
cd src  
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"
nm liblua-5.x.y-redirect.a | grep printf
nm liblua-5.x.y-redirect.a | grep fputs
nm liblua-5.x.y-redirect.a | grep fwrite
获取测试程序(C/C++混合,抱歉)。通过以下方式构建:

g++ -DLUA_REDIRECT -I/path/to/lua-5.2.1/src/ -L. lua-redirect-test.cpp -llua-5.2.1-redirect -ldl -o lua-redirect-test  
输出:

===== Test 1 output =====
Lua stdout buffer:
---
hello world!

---
Lua stderr buffer:
---

---
Lua error message:
---
(null)
---
===== Test 2 output =====
Lua stdout buffer:
---

---
Lua stderr buffer:
---

---
Lua error message:
---
[string "bad_function()"]:1: attempt to call global 'bad_function' (a nil value)
---

Lua的I/O库可能涵盖了您要查找的内容。
io.output
函数用于设置默认输出文件。查看5.2手册中的,看看还有什么


为什么要重新路由输出?你说你想以某种方式操纵它,但你这是什么意思?

我过去也这么做过。您需要修补Lua才能实现这一点。你用的是什么版本?我的补丁是针对Lua5.1的,但我也可以将其移植到5.2。我正在使用5.2。作为C API中的一个选项,这真的不可能吗?你知道,除了完全重新路由
stdout
,我更愿意避免这种情况,我的补丁是将输出函数重新定义为钩子,然后从应用程序或中间库设置它们,所以你可以使用你的自定义输出函数。@AndrejsCainikovs我不明白。我希望避免将
stdout
重新路由到自定义流,因为我使用
stdout
进行调试,并且希望避免一直来回切换。您的修补程序允许我这样做吗?这似乎与我的目的一致,但我需要知道如何,因为没有更好的术语,将
luaL\u dofile()
的输出“返回”到C中的
char*
。可以这样做吗?如果Lua脚本包含语法错误怎么办?如果要在缓冲区中而不是在标准输出/stderr上获取错误,则需要对Lua进行修补。@ewok luaL_dofile()不会写入标准输出。“输出”是什么意思?@kikito,但是
luaL\u dostring()
似乎是。看看我的代码。该代码导致“hello world!”被写入控制台。我希望它在
char*
@ewok中,在这种情况下,您必须从C重新定义print,以便它写入缓冲区。参见Mike M.在这里的回答:目标是让输出A)显示在gui中,而不是在控制台中;B)使用某些函数,在显示前用C完成计算