用 Lua 读文件时 seek 不正确及解决

最近写 Lua 代码写的比较多,然后就遇到了一些奇怪的问题。我写了一个简单的程序,需要用 seek 得到当前的偏移量,但最后发现 seek 得到的结果是错的!而且还导致程序无法停止。

 

看看这段代码:

local fin = io.open(arg[1]) local line = fin:read() local s = 0 while line ~= nil do io.write(s, ':', line, '/n') s = fin:seek() line = fin:read() end

这段程序的意思是取得每一行的起始偏移量并输出每一行的内容。看起来没有任何问题。

测试文件:

daffs dfs

只有两行,也没有任何问题。

 

运行:lua test.lua test.txt

 

然后就无限的输出“5:”。

 

最后我自己发现了问题是这样的:我的环境是 Windows,但那个测试文件的换行符是Unix(/n),不知道是 Lua 的问题还是 C Runtime 的问题,在这种情况下 seek 会返回错误的结果。而且似乎还会影响 read。因为如果我把那条 seek 语句去掉,一切正常,至少程序不会停不下来。这跟我们通常认为的 seek 是只读操作相违背。

 

如果把文件的换行符改成 Windows(/r/n)则一切正常。但我后来发现这个问题真正的解决方法是:第一行改为:io.open(arg[1], "rb"),使用二进制模式打开文件,皆大欢喜。

 

所以如果你要对文件进行比较底层的操作,最好用二进制模式打开。

你可能感兴趣的:(c,windows,unix,测试,lua)