C file input/output

The C programming language provides many standard library functions for file input and output. These functions make up the bulk of the C standard library header <stdio.h>.[1] The functionality descends from a "portable I/O package" written by Mike Lesk at Bell Labs in the early 1970s.[2]

The I/O functionality of C is fairly low-level by modern standards; C abstracts all file operations into operations on streams of bytes, which may be "input streams" or "output streams". Unlike some earlier programming languages, C has no direct support for random-access data files; to read from a record in the middle of a file, the programmer must create a stream, seek to the middle of the file, and then read bytes in sequence from the stream.

The stream model of file I/O was popularized by the Unix operating system, which was developed concurrently with the C programming language itself. The vast majority of modern operating systems have inherited streams from Unix, and many languages in the C programming language family have inherited C's file I/O interface with few if any changes (for example, PHP). The C++ standard library reflects the "stream" concept in its syntax; see iostream.

Contents

Overview of functions

Most of the C file input/output functions are defined in stdio.h (cstdio header in C++).

File access
Direct input/output
Unformatted input/output
Narrow character
Wide character
Formatted input/output
Narrow character
Wide character
File positioning
Error handling
Operations on files

Constants

Constants defined in the stdio.h header include:

Name Notes
EOF a negative integer of type int used to indicate end-of-file conditions
BUFSIZ an integer which is the size of the buffer used by the setbuf() function
FILENAME_MAX the size of a char array which is large enough to store the name of any file that can be opened
FOPEN_MAX the number of files that may be open simultaneously; will be at least 8
_IOFBF an abbreviation for "input/output fully buffered"; it is an integer which may be passed to the setvbuf() function to request block buffered input and output for an open stream
_IOLBF an abbreviation for "input/output line buffered"; it is an integer which may be passed to the setvbuf() function to request line buffered input and output for an open stream
_IONBF an abbreviation for "input/output not buffered"; it is an integer which may be passed to the setvbuf() function to request unbuffered input and output for an open stream
L_tmpnam the size of a char array which is large enough to store a temporary filename generated by the tmpnam() function
NULL a macro expanding to the null pointer constant; that is, a constant representing a pointer value which is guaranteed not to be a valid address of an object in memory
SEEK_CUR an integer which may be passed to the fseek() function to request positioning relative to the current file position
SEEK_END an integer which may be passed to the fseek() function to request positioning relative to the end of the file
SEEK_SET an integer which may be passed to the fseek() function to request positioning relative to the beginning of the file
TMP_MAX the maximum number of unique filenames generable by the tmpnam() function; will be at least 25

Variables

Variables defined in the stdio.h header include:

Name Notes
stdin a pointer to a FILE which refers to the standard input stream, usually a keyboard.
stdout a pointer to a FILE which refers to the standard output stream, usually a display terminal.
stderr a pointer to a FILE which refers to the standard error stream, often a display terminal.

Member types

Data types defined in the stdio.h header include:

Example

The following C program opens a binary file called myfile, reads five bytes from it, and then closes the file.

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    char buffer[5] = {0};  /* initialized to zeroes */
    int i, rc;
    FILE *fp = fopen("myfile", "rb");
    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }
    for (i = 0; (rc = getc(fp)) != EOF && i < 5; buffer[i++] = rc)
        ;
    fclose(fp);
    if (i == 5) {
        puts("The bytes read were...");
        printf("%x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);
    } else
        fputs("There was an error reading the file.\n", stderr);
    return EXIT_SUCCESS;
}

References