Lua - File Positioning
In case file contains numbers, Lua provides a very useful method io.read("*number") from the current input file. This method skips any space before any number and can read any format of the number. If a number is not present at current file position, it will return nil.
number = io.read ("*number")
we will use a sample file numbers.txt as shown below−
example.txt
6.0 -3.23 15e12 4.3 234 1000001 3.132 -234 10001
Example - Printing maximum of numbers using io.read("*number")
Let us now see how to compute maximum of numbers from each row.
main.lua
-- print maximum numbers
function printMax()
-- Opens a file in read mode,
f = io.open("numbers.txt")
-- set the f as default input
io.input(f)
-- loop till end of file
while true do
-- read three numbers from the line
local n1, n2, n3 = io.read("*number", "*number","*number")
-- if number is nil break the loop
if not n1 then break end
-- compute maximum of three numbers
print(math.max(n1, n2, n3))
end
-- close the file handle
io.close()
end
-- read the file and print max
printMax()
Output
When the above code is built and executed, it produces the following result −
15000000000000 1000001 10001
Example - Printing maximum of numbers using io.read("*all")
Let us now see how to compute maximum of numbers from each row while reading all contents.
main.lua
-- print maximum numbers
function printMax()
-- Opens a file in read mode,
f = io.open("numbers.txt")
-- set the f as default input file
io.input(f)
-- set the pattern to read three numbers
local pat = "(%S+)%s+(%S+)%s+(%S+)%s+"
-- read all lines and search pattern
for n1, n2, n3 in string.gfind(io.read("*all"), pat) do
print(math.max(n1, n2, n3))
end
-- close the file handle
io.close()
end
-- read the file
printMax()
Output
When the above code is built and executed, it produces the following result −
15000000000000 1000001 10001
Example - Printing content of file using io.read(num)
io.read(num) is a special method to read required bytes from a file. Following is the syntax of io.read(num) method.
number = io.read (size)
where size is the buffer size.
Let us now see how to read content of a file block wise using read(num) method
main.lua
-- print numbers
function printContents()
-- Opens a file in read mode,
f = io.open("numbers.txt")
-- set the f as default input
io.input(f)
-- buffer size of 8K
local size = 2^13
while true do
-- read a block of 8k
local block = io.read(size)
-- if nil, break the loop
if not block then break end
-- print the content
print(block)
end
-- close the file handle
io.close()
end
-- print content of the file
printContents()
Output
When the above code is built and executed, it produces the following result −
6.0 -3.23 15e12 4.3 234 1000001 3.1 -234 10001