Skip to main content

C File I/O Tutorial with Examples: fopen, fclose, fread, fwrite

·664 words·4 mins
C File Linux
Table of Contents

Introduction to File Handling in C
#

In C programming, there are two main ways to persist data:

  • Files (stored on disk)
  • Databases (structured data storage)

This tutorial focuses on file I/O (Input/Output) using the C Standard Library.


Text Files vs. Binary Files in C
#

  • Text files: store characters in readable form (ASCII, Unicode). Example: .txt files.
  • Binary files: store raw data not directly readable by humans. Example: executables, images, audio files.

Opening and Closing Files in C (fopen, fclose)
#

fopen() – Open a File
#

FILE *fopen(const char *path, const char *mode);
  • path: file name or path (e.g., "./file.txt")
  • mode: read, write, or append
  • Returns: file stream pointer on success, or NULL if failed

Common File Modes in C
#

Mode Meaning Behavior
r Read only File must exist, read from start
w Write only Creates or overwrites file
a Append only Creates if not exists, writes at end
r+ Read/Write File must exist, read & write from start
w+ Write/Read Creates or overwrites file
a+ Append/Read Creates if not exists, writes at end, reads from start

fclose() – Close a File
#

int fclose(FILE *fp);
  • Closes an open file stream
  • Returns 0 on success, EOF on failure

Basic Steps for File I/O in C
#

  1. Declare a file pointer
  2. Open the file with fopen()
  3. Perform operations (read/write)
  4. Close the file with fclose()
#include <stdio.h>

int main() {
    FILE *fp = NULL;              
    fp = fopen("./1.txt", "r");   // open file for reading

    if (fp == NULL) {
        printf("Failed to open file!\n");
        return 1;
    }

    // perform file operations here...

    fclose(fp);                   
    fp = NULL;                    
    return 0;
}

Formatted File I/O in C (fprintf, fscanf)
#

Writing to a File with fprintf
#

int fprintf(FILE *stream, const char *format, ...);

Example:

#include <stdio.h>
int main() {
    FILE *fp = fopen("./test.txt", "w+");  

    if (fp == NULL) {
        printf("File open error!\n");
        return 1;
    }

    fprintf(fp, "%s %d", "Score", 100);   // write "Score 100" to file

    fclose(fp);
    return 0;
}

Reading from a File with fscanf
#

int fscanf(FILE *stream, const char *format, ...);

Example:

#include <stdio.h>
int main() {
    FILE *fp = fopen("./test.txt", "r");  
    if (fp == NULL) {
        printf("File open error!\n");
        return 1;
    }

    char str[100];
    int num;
    fscanf(fp, "%s %d", str, &num);   
    printf("Read: %s %d\n", str, num);

    fclose(fp);
    return 0;
}

Binary File I/O in C (fwrite, fread)
#

Writing Binary Data with fwrite
#

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

Example:

#include <stdio.h>
int main() {
    FILE *fp = fopen("./bin.dat", "w+");  
    if (fp == NULL) return 1;

    int a[5] = {10, 20, 30, 40, 50};
    fwrite(a, sizeof(int), 5, fp);   // write array to file

    fclose(fp);
    return 0;
}

Reading Binary Data with fread
#

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

Example:

#include <stdio.h>
int main() {
    FILE *fp = fopen("./bin.dat", "r");  
    if (fp == NULL) return 1;

    int buffer[5];
    fread(buffer, sizeof(int), 5, fp);   // read data into buffer

    for (int i = 0; i < 5; i++) {
        printf("%d ", buffer[i]);
    }

    fclose(fp);
    return 0;
}

Output:

10 20 30 40 50

File Positioning in C (fseek, ftell)
#

Sometimes you need to move around inside a file instead of reading sequentially.

fseek() – Set File Position
#

int fseek(FILE *stream, long offset, int whence);
  • SEEK_SET: from beginning
  • SEEK_CUR: from current position
  • SEEK_END: from end

Examples:

fseek(fp, 8, SEEK_SET);   // move 8 bytes from start
fseek(fp, -12, SEEK_END); // move 12 bytes back from end

ftell() – Get File Position
#

long ftell(FILE *stream);

Example:

#include <stdio.h>
int main() {
    FILE *fp = fopen("./bin.dat", "r");
    if (fp == NULL) return 1;

    fseek(fp, 8, SEEK_SET);      
    long pos = ftell(fp);        
    printf("Current position: %ld\n", pos);

    fclose(fp);
    return 0;
}

Conclusion
#

With these C standard library functions, you can:

  • Open and close files (fopen, fclose)
  • Read and write text with formatting (fprintf, fscanf)
  • Read and write raw binary data (fread, fwrite)
  • Control file positions (fseek, ftell)

These file handling functions form the foundation of data persistence in C programming.

Related

Using the envsubst Command to Replace Environment Variables
·393 words·2 mins
Envsubst Linux Shell Script Environment Variables
如何在Linux中搭建DNS服务
·180 words·1 min
Linux DNS Linux TLD TTL
How to Perform UDP Ping in Linux
·451 words·3 mins
Linux UDP Ping Network Troubleshooting