...
/Reading and Writing, but not Sequentially
Reading and Writing, but not Sequentially
We do not always read or write a file from scratch, thus, in this lesson, we discuss how reads and writes at some offset take place.
We'll cover the following...
Thus far, we’ve discussed how to read and write files, but all access has been sequential; that is, we have either read a file from the beginning to the end, or written a file out from beginning to end.
Sometimes, however, it is useful to be able to read or write to a specific offset within a file; for example, if you build an index over a text document, and use it to look up a specific word, you may end up reading from some random offsets within the document. To do so, we will use the lseek()
system call. Here is the function prototype:
off_t lseek(int fildes, off_t offset, int whence);
The first argument is familiar (a file descriptor). The second argument is the offset
, which positions the file offset to a particular location within the file. The third argument, called whence
for historical reasons, determines exactly how the seek is performed. From the man page:
If whence is SEEK_SET, the offset is set to offset bytes.If whence is SEEK_CUR, the offset is set to its currentlocation plus offset bytes.If whence is SEEK_END, the offset is set to the size ofthe file plus offset bytes.
As you can tell from this description, for each file a process opens, the OS tracks a “current” offset, which determines where the next read or write will begin reading from or writing to within the file. Thus, part of the abstraction of an open file is that ...