NAME
fopen, fdopen,
    freopen —
    stream open functions
SYNOPSIS
#include
  <stdio.h>
FILE *
  
  fopen(const
    char *path, const char
    *mode);
FILE *
  
  fdopen(int
    fildes, const char
    *mode);
FILE *
  
  freopen(const
    char *path, const char
    *mode, FILE
    *stream);
DESCRIPTION
The
    fopen()
    function opens the file whose name is the string pointed to by
    path and associates a stream with it.
The argument mode points to a string beginning with one of the following sequences (additional characters may follow these sequences):
- “r”
- Open file for reading.
- “r+”
- Open for reading and writing.
- “w”
- Open for writing. The file is created if it does not exist, otherwise it is truncated.
- “w+”
- Open for reading and writing. The file is created if it does not exist, otherwise it is truncated.
- “a”
- Open for writing. The file is created if it does not exist.
- “a+”
- Open for reading and writing. The file is created if it does not exist.
The mode string can also include the letter ``b'' either as the last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with ANSI X3.159-1989 (“ANSI C89”) and has no effect; the ``b'' is ignored.
The
    fopen() and
    freopen() functions initially position the stream at
    the start of the file unless the file is opened in append mode
    (‘a’ or ‘a+’), in which case the stream is
    initially positioned at the end of the file.
Opening a file in append mode causes all subsequent writes to it to be forced to the current end-of-file, regardless of intervening repositioning of the stream.
Any created files will have mode
    "S_IRUSR | S_IWUSR |
    S_IRGRP | S_IWGRP |
    S_IROTH | S_IWOTH"
    (0666), as modified by the process' umask value (see
    umask(2)).
Reads and writes cannot be arbitrarily intermixed on read/write streams. ANSI C requires that a file positioning function intervene between output and input, unless an input operation encounters end-of-file.
The
    fdopen()
    function associates a stream with the existing file descriptor
    fildes. The mode of the stream
    must be compatible with the mode of the file descriptor. The stream is
    positioned at the file offset of the file descriptor. If
    fdopen() fails, the file descriptor
    fildes is not affected in any way.
The
    freopen()
    function opens the file whose name is the string pointed to by
    path and associates the stream pointed to by
    stream with it. The original stream (if it exists) is
    always closed, even if freopen() fails. The
    mode argument is used just as in the
    fopen() function. The primary use of the
    freopen() function is to change the file associated
    with a standard text stream
    (stderr,
    stdin,
    or
    stdout).
RETURN VALUES
Upon successful completion, fopen(),
    fdopen(), and freopen()
    return a FILE pointer. Otherwise,
    NULL is returned and the global variable
    errno is set to indicate the error.
ERRORS
- [EINVAL]
- The mode provided to
      fopen(),fdopen(), orfreopen() was invalid.
The fopen(),
    fdopen() and freopen()
    functions may also fail and set errno for any of the
    errors specified for the routine
    malloc(3).
The fopen() function may also fail and set
    errno for any of the errors specified for the routine
    open(2).
The fdopen() function may also fail and
    set errno for any of the errors specified for the
    routine fcntl(2).
The freopen() function may also fail and
    set errno for any of the errors specified for the
    routines open(2),
    fclose(3), and
    fflush(3).
SEE ALSO
STANDARDS
The fopen() and
    freopen() functions conform to ANSI
    X3.159-1989 (“ANSI C89”). The
    fdopen() function conforms to IEEE
    Std 1003.1-1988 (“POSIX.1”).
HISTORY
The fopen() function first appeared in
    Version 1 AT&T UNIX. The
    fdopen() and freopen()
    functions first appeared in Version 7 AT&T
    UNIX.
Opening a file for both reading and writing has been possible since 2BSD.
AUTHORS
Dennis Ritchie originally implemented
    fopen() in PDP-11 assembler.
  
  Keith Sklower first implemented read-write access.
CAVEATS
Proper code using fdopen() with error
    checking should close(2) fildes in case of failure, and
    fclose(3) the resulting FILE * in case of
    success.
	FILE *file;
	int fd;
	if ((file = fdopen(fd, "r")) != NULL) {
		/* perform operations on the FILE * */
		fclose(file);
	} else {
		/* failure, report the error */
		close(fd);
	}