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
Advertisements