ZetCode

C fopen function

last modified April 6, 2025

File handling is a fundamental skill in C programming, enabling you to read from and write to files efficiently. The fopen function is your gateway to file operations, offering various modes to suit your needs. This tutorial dives into the essentials of fopen, explains its modes, and provides hands-on examples to solidify your understanding. Mastering file handling ensures robust data management and smooth I/O operations in your programs.

What Is fopen?

The fopen function in C opens a file and returns a FILE pointer for subsequent operations. It requires two parameters: the file's name (or path) and the mode, which defines how you intend to interact with the file. Common modes include reading, writing, or appending. Always verify that fopen doesn't return NULL to catch errors early, and use fclose to properly close the file when finished.

Opening a File for Reading

Let's explore how to open and read a text file using fopen in read mode.

read_file.c
#include <stdio.h>

int main() {
    FILE *fp;
    char ch;

    fp = fopen("data.txt", "r");  // Open file in read-only mode

    if (fp == NULL) {
        perror("Failed to open file");  // Improved error reporting
        return 1;
    }

    while ((ch = fgetc(fp)) != EOF) {  // Read and display each character
        putchar(ch);
    }

    fclose(fp);  // Release file resources
    return 0;
}

Here, fopen opens "data.txt" in read mode ("r"). If the file doesn't exist or can't be accessed, fp is NULL, and we use perror for detailed error feedback. The fgetc function reads characters one by one until it hits the end-of-file marker (EOF). Finally, fclose ensures the file is properly closed.

Opening a File for Writing

Next, see how to create or overwrite a file with fopen in write mode.

write_file.c
#include <stdio.h>

int main() {
    FILE *fp;

    fp = fopen("notes.txt", "w");  // Open file in write mode

    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    fprintf(fp, "Welcome to C file handling!\n");  // Write a greeting
    fclose(fp);  // Close the file to save changes

    return 0;
}

In this example, fopen opens "notes.txt" in write mode ("w"), creating it if it doesn't exist or overwriting it if it does. The fprintf function writes a formatted string to the file. Closing the file with fclose ensures the data is saved and resources are freed.

Appending to a File

Learn how to add content to the end of an existing file using append mode.

append_file.c
#include <stdio.h>

int main() {
    FILE *fp;

    fp = fopen("notes.txt", "a");  // Open file in append mode

    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    fprintf(fp, "Adding a new note.\n");  // Append text
    fclose(fp);  // Save and close

    return 0;
}

Using append mode ("a"), fopen positions the file pointer at the end of "notes.txt". New data, written via fprintf, is added without overwriting existing content. If the file doesn't exist, it's created. Closing the file ensures the appended data is stored.

Reading and Writing Binary Data

Handle non-text data, like integers, by using binary modes with fopen.

binary_file.c
#include <stdio.h>

int main() {
    FILE *fp;
    int numbers[] = {10, 20, 30, 40, 50};
    int read_numbers[5];

    // Write binary data
    fp = fopen("numbers.bin", "wb");  // Binary write mode
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    fwrite(numbers, sizeof(int), 5, fp);  // Write array
    fclose(fp);

    // Read binary data
    fp = fopen("numbers.bin", "rb");  // Binary read mode
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }
    fread(read_numbers, sizeof(int), 5, fp);  // Read into array
    fclose(fp);

    // Display results
    printf("Read values: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", read_numbers[i]);
    }
    printf("\n");

    return 0;
}

Binary write mode ("wb") and read mode ("rb") allow fopen to manage raw data. The fwrite function stores an array of integers, while fread retrieves it. Binary mode preserves data exactly as is, making it ideal for non-text files like images or datasets.

Reading a File Line by Line

Read text files line by line for easier processing with this example.

read_lines.c
#include <stdio.h>

int main() {
    FILE *fp;
    char line[128];  // Increased buffer for safety

    fp = fopen("data.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    while (fgets(line, sizeof(line), fp) != NULL) {  // Read each line
        printf("Line: %s", line);
    }

    fclose(fp);
    return 0;
}

The fgets function reads up to a newline or EOF, storing the result in a buffer. Here, a 128-character buffer accommodates longer lines. The loop continues until fgets returns NULL, indicating the file's end. This method is perfect for parsing structured text files.

Checking File Existence

Verify if a file exists before performing operations with this simple check.

file_exists.c
#include <stdio.h>

int main() {
    FILE *fp;

    fp = fopen("missing.txt", "r");  // Attempt to open in read mode
    if (fp == NULL) {
        printf("File not found.\n");
        return 1;
    }

    printf("File exists!\n");
    fclose(fp);
    return 0;
}

Opening a file in read mode ("r") with fopen returns NULL if the file doesn't exist. This technique is a quick way to test for a file's presence. If the file opens successfully, don't forget to close it with fclose.

Updating a File

Modify an existing file by reading and writing with update mode.

update_file.c
#include <stdio.h>

int main() {
    FILE *fp;

    fp = fopen("data.txt", "r+");  // Open for reading and writing
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // Read and display first character
    char ch = fgetc(fp);
    printf("Original first character: %c\n", ch);

    // Overwrite first character
    rewind(fp);  // Reset pointer to start
    fputc('Z', fp);  // Replace with 'Z'

    fclose(fp);
    return 0;
}

Update mode ("r+") enables both reading and writing with fopen. The file must exist, or NULL is returned. Here, we read the first character, reset the pointer with rewind, and overwrite it. Use fseek for precise positioning in larger updates.

Best Practices for Using fopen

Source

C fopen Documentation

This tutorial has walked you through the power of fopen in C, showcasing practical examples from basic reading to binary operations. Effective file handling is key to building reliable, data-driven applications.

Author

My name is Jan Bodnar, and I'm a dedicated programmer with a deep passion for coding. Since 2007, I've been sharing my expertise through over 1,400 articles and 8 e-books. With more than a decade of teaching experience, I strive to make programming accessible and engaging.

List C Standard Library.