从文件中读写高分记录(Lua - Corona SDK)

我的问题是:我有一个文件,里面写有高分记录(仅第一行,无昵称,只有高分数),我需要读取该行并将其与游戏中实际获得的分数进行比较,如果分数更高,则用新值覆盖文件,但是,如果我尝试读取文件,我得到了一个空值……看起来我没有以正确的方式读取它。我的代码有什么问题?

感谢您的帮助!

local path = system.pathForFile("data.sav", system.DocumentsDirectory)

local file = io.open(path, "w+")

highscore_letta = file:read("*n")
print(highscore_letta)

if (_G.player_score > tonumber(highscore_letta)) then
   file:write(_G.player_score)
end

io.close(file)
点赞
用户9383219
用户9383219

我之前也遇到过这个问题。我发现如果你以 "w+" 模式打开一个文件,它现有的内容会被删除,这样你就能够 写入 新的内容了。所以,要读和写,你需要将这个文件打开两次。首先,你以 "rb" 模式打开文件并获取文件内容,然后关闭它。然后你以 "wb" 模式重新打开它,写入新的数字,然后关闭它。

在 Windows 中,你需要在文件模式中加入 "b"。否则,你读写的字符串可能会被意外修改:例如,换行符 ("\n") 可能会被替换为回车换行符 ("\r\n")。

Lua 支持的文件模式是从 C 语言借来的。(我在这份 C 规范草案的第 305 页 找到了描述。)我认为,Lua 手册有点假定你会知道这些模式的含义,就像一个有经验的 C 程序员一样,但对我来说却不是很明显。

因此,要先读取一个数字,然后写入一个新数字:

local filepath = "path/to/file"
-- 创建一个文件句柄,允许你读取当前内容。
local read_file = io.open(filepath, "rb")
number = read_file:read("*n") -- 读取一个数字。在 Lua 5.3 中,使用 "n";星号不是必需的。
read_file:close() -- 关闭文件句柄。

local new_number = 0 -- 用你实际想要写入的数字替换这里。
-- 创建一个文件句柄,允许你写入新内容到文件中,同时删除当前内容。
write_file = io.open(filepath, "wb")
write_file:write(new_number) -- 覆盖整个文件的内容。
write_file:flush() -- 确保新的内容实际上被保存了。
write_file:close() -- 关闭文件句柄。

我创建了一个脚本,可以自动执行这些操作,因为每次都要输入很麻烦。

模式 "r+""r+b" 可以同时读写,但如果原始内容比新内容长,我无法让它正常工作。如果原始内容为 "abcd"(4 字节),新内容为 "efg"(3 字节),并且您在文件偏移量 0 处写入,那么文件现在将包含 "efgd":原始内容的最后一个字节并未被删除。

2018-03-20 01:41:26