The I/O library provides two different styles for file manipulation.
The first one uses implicit file descriptors;
that is, there are operations to set a default input file and a
default output file,
and all input/output operations are over these default files.
The second style uses explicit file descriptors.
When using implicit file descriptors,
all operations are supplied by table
When using explicit file descriptors,
io.open returns a file descriptor
and then all operations are supplied as methods of the file descriptor.
io also provides
three predefined file descriptors with their usual meanings from C:
The I/O library never closes these files.
Unless otherwise stated,
all I/O functions return nil on failure
(plus an error message as a second result and
a system-dependent error code as a third result)
and some value different from nil on success.