最近写 Lua 代码写的比较多,然后就遇到了一些奇怪的问题。我写了一个简单的程序,需要用 seek 得到当前的偏移量,但最后发现 seek 得到的结果是错的!而且还导致程序无法停止。
看看这段代码:
这段程序的意思是取得每一行的起始偏移量并输出每一行的内容。看起来没有任何问题。
测试文件:
只有两行,也没有任何问题。
运行:lua test.lua test.txt
然后就无限的输出“5:”。
最后我自己发现了问题是这样的:我的环境是 Windows,但那个测试文件的换行符是Unix(/n),不知道是 Lua 的问题还是 C Runtime 的问题,在这种情况下 seek 会返回错误的结果。而且似乎还会影响 read。因为如果我把那条 seek 语句去掉,一切正常,至少程序不会停不下来。这跟我们通常认为的 seek 是只读操作相违背。
如果把文件的换行符改成 Windows(/r/n)则一切正常。但我后来发现这个问题真正的解决方法是:第一行改为:io.open(arg[1], "rb"),使用二进制模式打开文件,皆大欢喜。
所以如果你要对文件进行比较底层的操作,最好用二进制模式打开。