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] and officially became part of the Unix operating system in Version 7.[3]

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 Unix, 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 for details.

Overview of functions

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

Byte
character
Wide
character
Description
File access fopen Opens a file (with a non-Unicode filename on Windows and possible UTF-8 filename on Linux)
freopen Opens a different file with an existing stream
fflush Synchronizes an output stream with the actual file
fclose closes a file
setbuf Sets the buffer for a file stream
setvbuf Sets the buffer and its size for a file stream
fwide Switches a file stream between wide-character I/O and narrow-character I/O
Direct
input/output
fread Reads from a file
fwrite Writes to a file
Unformatted
input/output
fgetc
getc
fgetwc
getwc
Reads a byte/wchar_t from a file stream
fgets fgetws Reads a byte/wchar_t line from a file stream
fputc
putc
fputwc
putwc
Writes a byte/wchar_t to a file stream
fputs fputws Writes a byte/wchar_t string to a file stream
getchar getwchar Reads a byte/wchar_t from stdin
gets N/A Reads a byte string from stdin until a newline or end of file is encountered (deprecated in C99, removed from C11)
putchar putwchar writes a byte/wchar_t to stdout
puts N/A Writes a byte string to stdout
ungetc ungetwc Puts a byte/wchar_t back into a file stream
Formatted
input/output
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
Reads formatted byte/wchar_t input from stdin,
a file stream or a buffer
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
Reads formatted input byte/wchar_t from stdin,
a file stream or a buffer using variable argument list
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
Prints formatted byte/wchar_t output to stdout,
a file stream or a buffer
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Prints formatted byte/wchar_t output to stdout,
a file stream, or a buffer using variable argument list
perror N/A Writes a description of the current error to stderr
File positioning ftell Returns the current file position indicator
fgetpos Gets the file position indicator
fseek moves the file position indicator to a specific location in a file
fsetpos Moves the file position indicator to a specific location in a file
rewind Moves the file position indicator to the beginning in a file
Error
handling
clearerr Clears errors
feof Checks for the end-of-file
ferror Checks for a file error
Operations
on files
remove Erases a file
rename renames a file
tmpfile Returns a pointer to a temporary file
tmpnam Returns a unique filename

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 eight
_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;
    FILE *fp = fopen("myfile", "rb");
 
    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }
 
    /* Be sure to never read more than five characters */
    for (i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
        buffer[i] = rc;
    }
 
    fclose(fp);
 
    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);
 
    return EXIT_SUCCESS;
}

See also

References

  1. ISO/IEC 9899:1999 specification. p. 274, § 7.19.
  2. Kernighan, Brian; Pike, Rob (1984). The UNIX Programming Environment. Englewood Cliffs: Prentice Hall. p. 200.
  3. McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (Technical report). CSTR. Bell Labs. 139.

External links

The Wikibook C Programming has a page on the topic of: C Programming/C Reference