FOPEN(3C) Standard C Library Functions FOPEN(3C)
NAME
fopen - open a stream
SYNOPSIS
#include <stdio.h>
FILE *fopen(
const char *filename,
const char *mode);
DESCRIPTION
The
fopen() function opens the file whose pathname is the string
pointed to by
filename, and associates a stream with it.
The argument
mode points to a string beginning with one of the
following base sequences:
r Open file for reading.
w Truncate to zero length or create file for
writing.
a Append; open or create file for writing at end-
of-file.
r+ Open file for update (reading and writing).
w+ Truncate to zero length or create file for
update.
a+ Append; open or create file for update, writing
at end-of-file.
In addition to the base sequences for the
mode argument above, three
additional flags are supported via the
b character, the
e character,
and the
x character. Order of these additional flags (including the
+) does not matter.
The character
b has no effect, but is allowed for ISO C standard
conformance (see
standards(7)). Opening a file with read mode (
r as
the first character in the
mode argument) fails if the file does not
exist or cannot be read.
The character
e will cause the underlying file descriptor to be
opened with the O_CLOEXEC flag as described in
open(2).
The character
x will attempt to open the specified file exclusively.
This is the same behavior as opening the underlying file with the
O_EXCL flag as described in
open(2).
Opening a file with append mode (
a as the first character in the
mode argument) causes all subsequent writes to the file to be forced to
the then current end-of-file, regardless of intervening calls to
fseek(3C). If two separate processes open the same file for append,
each process may write freely to the file without fear of destroying
output being written by the other. The output from the two processes
will be intermixed in the file in the order in which it is written.
When a file is opened with update mode (
+ as the second or third
character in the
mode argument), both input and output may be
performed on the associated stream. However, output must not be
directly followed by input without an intervening call to
fflush(3C) or to a file positioning function (
fseek(3C),
fsetpos(3C) or
rewind(3C)), and input must not be directly followed by output
without an intervening call to a file positioning function, unless
the input operation encounters end-of-file.
When opened, a stream is fully buffered if and only if it can be
determined not to refer to an interactive device. The error and end-
of-file indicators for the stream are cleared.
If
mode begins with
w or
a and the file did not previously exist,
upon successful completion,
fopen() function will mark for update the
st_atime,
st_ctime and
st_mtime fields of the file and the
st_ctime and
st_mtime fields of the parent directory.
If
mode begins with
w and the file did previously exist, upon
successful completion,
fopen() will mark for update the
st_ctime and
st_mtime fields of the file. The
fopen() function will allocate a
file descriptor as
open(2) does.
Normally, 32-bit applications return an
EMFILE error when attempting
to associate a stream with a file accessed by a file descriptor with
a value greater than 255. If the last character of
mode is
F, 32-bit
applications will be allowed to associate a stream with a file
accessed by a file descriptor with a value greater than 255. A
FILE pointer obtained in this way must never be used by any code that
might directly access fields in the
FILE structure. If the fields in
the
FILE structure are used directly by 32-bit applications when the
last character of mode is
F, data corruption could occur. See the
USAGE section of this manual page and the
enable_extended_FILE_stdio(3C) manual page for other options for
enabling the extended FILE facility.
In 64-bit applications, the last character of
mode is silently
ignored if it is
F. 64-bit applications are always allowed to
associate a stream with a file accessed by a file descriptor with any
value.
The largest value that can be represented correctly in an object of
type
off_t will be established as the offset maximum in the open file
description.
RETURN VALUES
Upon successful completion,
fopen() returns a pointer to the object
controlling the stream. Otherwise, a null pointer is returned and
errno is set to indicate the error.
The
fopen() function may fail and not set
errno if there are no free
stdio streams.
ERRORS
The
fopen() function will fail if:
EACCES Search permission is denied on a component of the
path prefix, or the file exists and the permissions
specified by
mode are denied, or the file does not
exist and write permission is denied for the parent
directory of the file to be created.
EINTR A signal was caught during the execution of
fopen().
EISDIR The named file is a directory and
mode requires write
access.
ELOOP Too many symbolic links were encountered in resolving
path.
EMFILE There are {
OPEN_MAX} file descriptors currently open
in the calling process.
ENAMETOOLONG The length of the
filename exceeds
PATH_MAX or a
pathname component is longer than
NAME_MAX.
ENFILE The maximum allowable number of files is currently
open in the system.
ENOENT A component of
filename does not name an existing
file or
filename is an empty string.
ENOSPC The directory or file system that would contain the
new file cannot be expanded, the file does not exist,
and it was to be created.
ENOTDIR A component of the path prefix is not a directory.
ENXIO The named file is a character special or block
special file, and the device associated with this
special file does not exist.
EOVERFLOW The current value of the file position cannot be
represented correctly in an object of type
fpos_t.
EROFS The named file resides on a read-only file system and
mode requires write access.
The
fopen() function may fail if:
EINVAL The value of the
mode argument is not valid.
EMFILE {
FOPEN_MAX} streams are currently open in the calling
process.
{
STREAM_MAX} streams are currently open in the
calling process.
ENAMETOOLONG Pathname resolution of a symbolic link produced an
intermediate result whose length exceeds {
PATH_MAX}.
ENOMEM Insufficient storage space is available.
ETXTBSY The file is a pure procedure (shared text) file that
is being executed and
mode requires write access.
USAGE
A process is allowed to have at least {
FOPEN_MAX}
stdio streams open
at a time. For 32-bit applications, however, the underlying ABIs
formerly required that no file descriptor used to access the file
underlying a
stdio stream have a value greater than 255. To maintain
binary compatibility with earlier Solaris releases, this limit still
constrains 32-bit applications. However, when a 32-bit application is
aware that no code that has access to the
FILE pointer returned by
fopen() will use the
FILE pointer to directly access any fields in
the
FILE structure, the
F character can be used as the last character
in the
mode argument to circumvent this limit. Because it could lead
to data corruption, the
F character in
mode must never be used when
the
FILE pointer might later be used by binary code unknown to the
user. The
F character in
mode is intended to be used by library
functions that need a
FILE pointer to access data to process a user
request, but do not need to pass the
FILE pointer back to the user.
32-bit applications that have been inspected can use the extended
FILE facility to circumvent this limit if the inspection shows that
no
FILE pointers will be used to directly access
FILE structure
contents.
The
fopen() function has a transitional interface for 64-bit file
offsets. See
lf64(7).
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | See below. |
+--------------------+-----------------+
|MT-Level | MT-Safe |
+--------------------+-----------------+
The
F character in the
mode argument is Evolving. In all other
respects this function is Standard.
SEE ALSO
open(2),
enable_extended_FILE_stdio(3C),
fclose(3C),
fcloseall(3C),
fdopen(3C),
fflush(3C),
freopen(3C),
fsetpos(3C),
rewind(3C),
attributes(7),
lf64(7),
standards(7) November 24, 2014 FOPEN(3C)