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.
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.
Let's explore how to open and read a text file using fopen in read mode.
#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.
Next, see how to create or overwrite a file with fopen in write mode.
#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.
Learn how to add content to the end of an existing file using append mode.
#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.
Handle non-text data, like integers, by using binary modes with fopen.
#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.
Read text files line by line for easier processing with this example.
#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.
Verify if a file exists before performing operations with this simple check.
#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.
Modify an existing file by reading and writing with update mode.
#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.
fopen returns NULL to catch issues early.fclose to prevent resource leaks after operations.perror or custom messages to diagnose failures effectively.
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.
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.