Finding file positions at a low level
If you want to find a particular file position within a file, using a
low-level file routine, you can call the
lseek function. This is
very similar to the high-level file routine
fseek, except that it
accepts a file descriptor rather than a stream as an argument.
lseek function specifies the file position for the next
write operation. (See File position, for more
information on file positions.)
lseek function takes three parameters. The first parameter
is the file descriptor. The second is of type
off_t and specifies
the number of bytes to move the file position indicator. The third
argument and the third parameter is a constant that specifies whether
the offset is relative to the beginning of the file (
to the current file position (
SEEK_CUR), or to the end of the
SEEK_END is used,
the offset specified can be positive or negative. If you specify
SEEK_END, set the position past the current end of the file, and
actually write data, you will extend the file with zeroes up to the
position you specify. However, the blocks of zeroes are not actually
written to disk, so the file takes up less space on disk than it seems
to; this is called a sparse file.
The return value of
lseek is of type
off_t and normally
contains the resulting file position, as measured in bytes from the
beginning of the file. If you wish to read the current file position,
therefore, you can specify an offset of 0 and a third parameter of
SEEK_CUR, as follows:
file_position = lseek (file_descriptor, 0, SEEK_CUR);
If there was an error,
lseek returns a -1 and sets the system variable
errno to one of the following values:
- The file descriptor specified is invalid.
- Either the third parameter of
lseekis invalid, or the file offset is invalid.
- The file descriptor corresponds to an object that cannot be positioned, such as a terminal device.
lseek function is called by many high-level file position functions,