fclose() — Close file

Standards

Standards / Extensions C or C++ Dependencies

ISO C
POSIX.1
XPG4
XPG4.2
C99
Single UNIX Specification, Version 3

both  

Format

#include <stdio.h>

int fclose(FILE *stream);

General description

Flushes a stream, and then closes the file associated with that stream. Afterwards, the function releases any buffers associated with the stream. To flush means that unwritten buffered data is written to the file, and unread buffered data is discarded.

A pointer to a closed file cannot be used as an input value to the freopen() function.

Notes:
  1. The storage pointed to by the FILE pointer is freed by the fclose() function. An attempt to use the FILE pointer to a closed file is not valid. This restriction is true even when fclose() fails.
  2. If an application has locked a (FILE *) object (with flockfile() or ftrylockfile()), it is responsible for relinquishing the locked (FILE *) object (with funlockfile()) before calling fclose(). Failure to relinquish a locked (FILE *) object may cause deadlock (or looping).

Returned value

If successful closing the stream, fclose() returns 0.

If a failure occurs in flushing buffers or in outputting data, fclose() returns EOF. An attempt will still be made to close the file.

Special behavior for XPG4

fclose() sets errno to one of the following values:
Error Code
Description
EAGAIN
The O_NONBLOCK flag is set and output cannot be written immediately.
EBADF
The underlying file descriptor is not valid.
EFBIG
Writing to the output file would exceed the maximum file size or the process's file size supported by the implementation.
EINTR
The fclose() function was interrupted by a signal before it had written any output.
EIO
The process is in a background process group and is attempting to write to its controlling terminal, but TOSTOP (defined in the termio.h include file) is set, the process is neither ignoring nor blocking SIGTTOU signals, and the process group of the process is orphaned.
ENOSPC
There is no free space left on the output device
ENXIO
A request was made of a nonexistent device, or the request was outside the device.
EPIPE
fclose() is trying to write to a pipe or FIFO that is not open for reading by any process. This error also generates a SIGPIPE signal.

Example

/* This example opens a file myfile.dat for reading as a stream and then
   closes the file.
 */
#include <stdio.h>

int main(void)
{
   FILE *stream;

   stream = fopen("myfile.dat", "r");
⋮
   if (fclose(stream))   /* Close the stream. */
      printf("fclose error\n");
}

Related information