ZetCode

C tmpfile function

last modified April 6, 2025

Temporary file handling is crucial for secure and efficient data processing in C. The tmpfile function creates temporary files that are automatically deleted when closed. This tutorial explores tmpfile in depth, covering its behavior, advantages, and practical applications. You'll learn to create, use, and manage temporary files safely across different scenarios. Mastering tmpfile helps prevent file leaks and ensures clean temporary data handling.

What Is tmpfile?

The tmpfile function creates a temporary binary file opened in update mode (wb+). It returns a FILE pointer for file operations. The file is automatically deleted when closed with fclose or when the program terminates. tmpfile is secure as it creates files with unique names in the system's temporary directory. Always check for NULL returns to handle potential creation failures.

Basic tmpfile Usage

This example demonstrates the simplest way to create and use a temporary file.

basic_tmpfile.c
#include <stdio.h>

int main() {
    FILE *tmp = tmpfile();  // Create temporary file
    
    if (tmp == NULL) {
        perror("Failed to create temporary file");
        return 1;
    }

    fprintf(tmp, "This is temporary data\n");  // Write to temp file
    rewind(tmp);  // Reset file pointer
    
    char buffer[256];
    fgets(buffer, sizeof(buffer), tmp);  // Read back data
    printf("Read from temp file: %s", buffer);
    
    fclose(tmp);  // File automatically deleted
    return 0;
}

This code creates a temporary file with tmpfile and verifies the pointer isn't NULL. It writes data, rewinds to the start, then reads it back. The file is automatically deleted when fclose is called. This pattern is useful for short-lived data processing without leaving file artifacts.

Writing Binary Data to Temporary File

Temporary files can store binary data efficiently, as shown in this example.

binary_tmpfile.c
#include <stdio.h>

int main() {
    FILE *tmp = tmpfile();
    if (tmp == NULL) {
        perror("Failed to create temporary file");
        return 1;
    }

    int numbers[] = {10, 20, 30, 40, 50};
    fwrite(numbers, sizeof(int), 5, tmp);  // Write binary data
    
    rewind(tmp);
    
    int read_numbers[5];
    fread(read_numbers, sizeof(int), 5, tmp);  // Read binary data
    
    printf("Read values: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", read_numbers[i]);
    }
    printf("\n");
    
    fclose(tmp);
    return 0;
}

This example writes an integer array to a temporary file in binary format and reads it back. tmpfile creates a binary file by default (wb+ mode), making it ideal for binary operations. The data persists only during program execution, preventing sensitive data from remaining on disk.

Large Data Processing with tmpfile

Temporary files are excellent for handling data too large for memory.

large_data.c
#include <stdio.h>
#include <stdlib.h>

#define DATA_SIZE 1000000

int main() {
    FILE *tmp = tmpfile();
    if (tmp == NULL) {
        perror("Failed to create temporary file");
        return 1;
    }

    // Generate and write large dataset
    for (int i = 0; i < DATA_SIZE; i++) {
        double value = (double)rand() / RAND_MAX;
        fwrite(&value, sizeof(double), 1, tmp);
    }

    // Process data
    rewind(tmp);
    double sum = 0;
    double value;
    
    while (fread(&value, sizeof(double), 1, tmp) {
        sum += value;
    }

    printf("Average: %f\n", sum / DATA_SIZE);
    fclose(tmp);
    return 0;
}

This program generates one million random doubles, storing them in a temporary file. It then reads them back to calculate the average. Using tmpfile prevents memory exhaustion with large datasets while ensuring automatic cleanup. The file acts as an extension of memory for data processing tasks.

Multiple Temporary Files

Manage several temporary files simultaneously for complex operations.

multi_tmpfile.c
#include <stdio.h>

int main() {
    FILE *tmp1 = tmpfile();
    FILE *tmp2 = tmpfile();
    
    if (tmp1 == NULL || tmp2 == NULL) {
        perror("Failed to create temporary files");
        return 1;
    }

    fprintf(tmp1, "Data for first temporary file\n");
    fprintf(tmp2, "Data for second temporary file\n");
    
    // Process files independently
    rewind(tmp1);
    char line[256];
    fgets(line, sizeof(line), tmp1);
    printf("From tmp1: %s", line);
    
    rewind(tmp2);
    fgets(line, sizeof(line), tmp2);
    printf("From tmp2: %s", line);
    
    fclose(tmp1);
    fclose(tmp2);
    return 0;
}

This example creates two temporary files and processes them independently. Each tmpfile call generates a unique, unnamed temporary file. The program demonstrates how to manage multiple temporary resources safely. All files are automatically cleaned up when closed or when the program exits.

Error Handling with tmpfile

Proper error handling ensures robustness when working with temporary files.

error_handling.c
#include <stdio.h>
#include <errno.h>

int main() {
    FILE *tmp = tmpfile();
    
    if (tmp == NULL) {
        if (errno == EMFILE) {
            fprintf(stderr, "Too many open files\n");
        } else if (errno == EACCES) {
            fprintf(stderr, "Permission denied for temp directory\n");
        } else {
            perror("Unknown error creating temporary file");
        }
        return 1;
    }

    // Use the temporary file
    fprintf(tmp, "Error handling example\n");
    
    if (fflush(tmp) != 0) {
        perror("Failed to flush data");
        fclose(tmp);
        return 1;
    }
    
    fclose(tmp);
    return 0;
}

This code demonstrates comprehensive error handling for tmpfile. It checks for specific error conditions like too many open files (EMFILE) or permission issues (EACCES). The example also shows how to handle write operation errors. Proper error management prevents silent failures in file operations.

Secure Temporary Data Processing

tmpfile provides secure temporary storage for sensitive data.

secure_processing.c
#include <stdio.h>
#include <string.h>

void process_sensitive_data(const char *data) {
    FILE *tmp = tmpfile();
    if (tmp == NULL) {
        perror("Failed to create secure temporary file");
        return;
    }

    // Store sensitive data temporarily
    fprintf(tmp, "%s", data);
    
    // Process data
    rewind(tmp);
    char buffer[256];
    fgets(buffer, sizeof(buffer), tmp);
    
    // Securely process data here
    printf("Processing: %s", buffer);
    
    // Data automatically wiped when closed
    fclose(tmp);
}

int main() {
    const char *secret = "Confidential information\n";
    process_sensitive_data(secret);
    return 0;
}

This example shows how tmpfile securely handles sensitive information. The data exists only in memory or in a temporary file that's automatically deleted. This approach prevents sensitive data from persisting on disk. The file's automatic deletion guarantees cleanup even if the program crashes.

Combining tmpfile with Other File Operations

Integrate temporary files with standard file operations for complex workflows.

file_operations.c
#include <stdio.h>

void filter_data(FILE *input, FILE *output) {
    char line[256];
    while (fgets(line, sizeof(line), input) {
        if (line[0] != '#') {  // Filter out comment lines
            fputs(line, output);
        }
    }
}

int main() {
    FILE *input = fopen("data.txt", "r");
    if (input == NULL) {
        perror("Failed to open input file");
        return 1;
    }

    FILE *tmp = tmpfile();
    if (tmp == NULL) {
        perror("Failed to create temporary file");
        fclose(input);
        return 1;
    }

    filter_data(input, tmp);  // Process data into temp file
    fclose(input);
    
    // Use filtered data
    rewind(tmp);
    char line[256];
    printf("Filtered data:\n");
    while (fgets(line, sizeof(line), tmp)) {
        printf("%s", line);
    }
    
    fclose(tmp);
    return 0;
}

This program reads from a regular file, processes the data through a temporary file, then outputs the results. The temporary file serves as intermediate storage during processing. This pattern is common in data transformation pipelines. The temporary file automatically cleans up after processing completes.

Best Practices for Using tmpfile

Source

C tmpfile Documentation

This tutorial has explored the tmpfile function in C, demonstrating its use for secure, automatic temporary file handling. From basic usage to complex data processing, tmpfile provides a reliable solution for temporary storage needs. Its automatic cleanup ensures no residual files are left behind, making it ideal for many programming scenarios.

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.