Every programmer constantly encounters the need to read something from a file and write something to a file. At first glance, files may seem so simple!
A bit of theory
Modern operating systems have complex file input/output structures. Most operating systems do not allow programs to work directly with the disk to ensure maximum efficiency of file reading and writing and to control the security of this process. They cannot do it physically: one program cannot include an understanding of all the file systems — ways of storing data in files on a disk.
In addition to supporting different file systems, a modern operating system also deals with caching disk operations, checking access rights, and other administrative tasks.
The operating system provides specific objects for programs — file descriptors. With a file descriptor, you can write and read data without worrying about the file system, caching, and other low-level entities.