- 读写操作会设置同一个指针, 指针移动的距离为读写内容的长度。
p=f:seek() f:read(num)--假设文件内容够长 assert(f:seek()==p+num) f:write(str) assert(f:seek()==p+num+string.len(str))
- f:seek() (获取指针值)有f:flush() (将缓存写入文件)的功效。
- f:write() (文件写内容)后应f:flush() (将缓存写入文件),再f:read() (文件读内容)。否则,f:write()-f:read() 可能读取到意外数据(额外分配的缓存或溢出)。
- f:setvbuf() 会有未明确的影响,参考如下的 testcaseB==2 。
local f=io.tmpfile() -- 可能需要管理员权限 local fn if not f then fn='.'..os.tmpname() f=assert(io.open(fn,'w+')) end local s=0x1000--buffer size(缓存大小) local testcaseB=1 -- and 2 if testcaseB==2 then f:setvbuf('full',s) -- memory leak? 会导致内存泄露,f:read()将读取到意外的内容(require的其他脚本) end local c='abc'--content(内容),假设长度小于缓存大小 local l=string.len(c)--length(长度) assert(l<=s) f:write(c) local testcase=1 --uncomment to test -- and 2 -- and 3 local ec=string.rep('