the file position pointer
Picture reading a book with your finger resting under the next word. Every time you read a word your finger slides along; if you want to skip ahead you lift your finger and place it elsewhere. The file position pointer is the OS's finger in your open file: it marks the byte where the next read or write will happen.
When you open a file, this pointer starts at 0, the very first byte. Each read or write of n bytes advances the pointer by n, so a sequence of reads naturally walks through the file front to back without you tracking anything. The seek operation lets you pick the finger up and put it down at any chosen offset: seek to 0 to rewind, seek to the end to append, seek to byte 5000 to jump straight into the middle. Crucially, the pointer is associated with an OPEN of the file, not with the file itself, the OS stores it in the shared open-file structure that your descriptor leads to. That is why opening the same file twice gives you two independent positions, while duplicating a descriptor (so two handles share one open) makes them share a single position.
Why it matters: the position pointer is what turns a flat array of bytes into something you can stream through or jump around in, and it is the hidden state behind why reads keep returning the next chunk instead of the same bytes over and over. A classic bug comes from forgetting it: after writing data you must seek back to 0 before you can read what you just wrote, otherwise the pointer is sitting at the end and your read returns nothing.
Open a file, read(fd, buf, 10): you get bytes 0 through 9 and the position is now 10. Another read gets bytes 10 through 19. To re-read from the start, seek back to 0 first.
Reads and writes advance the pointer; seek moves it anywhere.
The position belongs to an OPEN, not the file. Two separate opens have independent positions; after writing, seek to 0 before reading or you will read from the end and get nothing.