.. _fileIO:

File I/O
========

.. index:: File I/O

- 
   Objective: Read and write to/from files like what we have done from
   the terminal.

-  Need to open a file, perform I/O and close the file.

- 
   To do this we need the notion of a *file descriptor*, which is our
   means of accessing the file.

- 
   There are two types of file descriptors.

   #.  
       Low level functions `open()`, `read()`, `write()`, `close()`
       use `int` file descriptors. -- Considered more difficult to use.

   #.

       `stdio.h` defines a `typedef` for a special data structure which is the
       file descriptor we will discuss.

- 
   We have already used two file descriptors: *stdin* and *stdout* to
   do I/O from the terminal. Another related file descriptor is
   *stderr*. *stderr* can be used to report errors or warnings that
   are not part of *stdout*. The `int` file descriptors for
   `stdin`, `stdout`, `stderr` are 0, 1, 2.


File I/O example
================

.. function:: fgets
.. function:: fprintf
.. function:: fscanf

::

    FILE *fp;
    char buff[SIZE];
    
    fp = fopen( "filename", "r+" ); /* filename could be supplied by a
                                        string instead of a constant. */
    
    fgets( buff, SIZE, fp );  /* used in ReadLine  */
    fprintf( fp, "format", ...);
    fscanf( fp, "format", ...);
    
    fclose(fp);

.. seealso::
  
   :ref:`readline`