Panduan Lengkap Fungsi fprintf di C: Sintaks, Contoh, dan Penggunaan Praktis

目次

1. Apa itu fungsi fprintf

Gambaran umum dasar fprintf

Fungsi fprintf adalah salah satu fungsi standar input/output dalam bahasa C. Peran utamanya adalah untuk “mencetak string dengan format tertentu”. Dengan menggunakan fprintf, Anda dapat menulis data ke tujuan output sesuai format yang ditentukan.

Secara umum, fprintf digunakan dalam situasi berikut:

  • Membuat file log: Mencatat riwayat eksekusi program atau informasi error.
  • Menyimpan data dengan format tertentu: Menyimpan angka atau string ke dalam file dengan format yang sudah ditentukan.
  • Mencetak informasi debugging: Menampilkan data untuk memeriksa perilaku program saat pengembangan.

Sintaks dasar fprintf

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

Penjelasan bagian sintaks

  • FILE *stream: Menentukan tujuan output. Misalnya, output standar (stdout) atau file yang dibuka dengan fopen.
  • const char *format: String yang menentukan format output. Ditulis dengan format yang sama seperti fungsi printf.
  • ...: Argumen variadik yang berisi data yang akan dicetak.

Nilai kembalian adalah jumlah karakter yang berhasil ditulis (bilangan bulat positif). Jika terjadi error, fungsi mengembalikan -1.

Perbandingan dengan fungsi lain

Fungsi yang mirip dengan fprintf adalah printf dan sprintf. Berikut perbedaannya:

Perbedaan dengan printf

printf digunakan untuk mencetak data ke output standar (biasanya konsol). Sebaliknya, fprintf memungkinkan Anda menentukan tujuan output, sehingga lebih fleksibel.

Contoh: penggunaan printf

printf("Hello, World!\n");

Output selalu ditampilkan di konsol.

Contoh: penggunaan fprintf

FILE *file = fopen("output.txt", "w");
fprintf(file, "Hello, World!\n");
fclose(file);

Dalam kasus ini, output ditulis ke file yang ditentukan (output.txt).

Perbedaan dengan sprintf

sprintf berbeda karena tujuan output-nya adalah “string”. Dengan kata lain, data ditulis ke buffer dalam memori.

Contoh: penggunaan sprintf

char buffer[50];
sprintf(buffer, "The result is %d", 42);

Dalam contoh ini, string "The result is 42" ditulis ke dalam buffer.

Ringkasan

  • fprintf adalah fungsi praktis yang memungkinkan output fleksibel ke file maupun standar output.
  • Dengan membedakan penggunaan printf dan sprintf, efisiensi dan keterbacaan program dapat ditingkatkan.

2. Cara dasar penggunaan fprintf

Sintaks dan penjelasan argumen dasar

Fungsi fprintf adalah alat fleksibel untuk mencetak data dengan format tertentu. Sintaks dasarnya adalah sebagai berikut:

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

Berikut penjelasan detail tiap argumen:

  1. FILE *stream
  • Menentukan tujuan penulisan.
  • Pilihan umum:
    • Output standar (stdout)
    • Output error standar (stderr)
    • File (dibuka dengan fungsi fopen)
  1. const char *format
  • Mendefinisikan format output.
  • Menggunakan format specifier untuk menentukan bentuk data (contoh: %s, %d, %f).
  1. Argumen variadik (…)
  • Menyediakan data yang sesuai dengan format specifier.
  • Contoh: jika format adalah "Name: %s, Age: %d", maka data yang diberikan harus berupa nama dan usia.

Nilai kembalian: jumlah karakter yang berhasil ditulis (bilangan bulat positif). Jika terjadi error, maka -1 akan dikembalikan.

Contoh kode dasar

Berikut contoh sederhana penggunaan fprintf:

Output ke standar (stdout)

Mencetak string dengan format ke standar output (stdout):

#include <stdio.h>

int main() {
    fprintf(stdout, "Hello, %s! You have %d new messages.\n", "Alice", 5);
    return 0;
}

Hasil output:

Hello, Alice! You have 5 new messages.

Pada contoh ini, stdout secara eksplisit ditentukan sebagai tujuan output.

Output ke file

Menulis data ke dalam file dengan fprintf:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w"); // membuka file dalam mode tulis
    if (file == NULL) {
        fprintf(stderr, "Error opening file.\n");
        return 1;
    }

    fprintf(file, "Name: %s, Age: %d\n", "Bob", 30);
    fclose(file); // menutup file
    return 0;
}

Isi dari output.txt:

Name: Bob, Age: 30

Dasar format specifier

fprintf menggunakan format specifier untuk mengontrol tampilan output. Berikut beberapa contoh dasar:

SpecifierDeskripsiContoh
%dBilangan bulat desimal42
%fBilangan pecahan (floating point)3.141593
%sString"Hello"
%cKarakter tunggal'A'
%xBilangan heksadesimal (huruf kecil)0x2a
%oBilangan oktal052

Contoh:

fprintf(stdout, "Integer: %d, Float: %.2f, String: %s\n", 10, 3.14, "Test");

Hasil output:

Integer: 10, Float: 3.14, String: Test
年収訴求

3. Pemanfaatan format pada fprintf

Lebar (Minimum Width)

Dengan menentukan lebar, jika jumlah karakter output lebih kecil dari lebar yang ditentukan, maka akan diisi dengan spasi.

Contoh:

fprintf(stdout, "|%10s|\n", "Hello");
fprintf(stdout, "|%10d|\n", 123);

Hasil output:

|     Hello|
|       123|

Di sini, lebar ditentukan sebagai 10. Jika jumlah karakter kurang, spasi akan ditambahkan di sisi kiri.


Presisi (Precision)

Presisi memiliki arti berbeda tergantung jenis data:

  • String (%s): Jumlah maksimum karakter yang dicetak.
  • Floating point (%f, %e, %g): Jumlah digit setelah koma desimal.

Contoh:

fprintf(stdout, "%.3f\n", 3.141592); // presisi untuk floating point
fprintf(stdout, "%.5s\n", "Hello, World!"); // panjang maksimum string

Hasil output:

3.142
Hello

Flag

Dengan flag, Anda dapat mengontrol perataan atau format output.

FlagDeskripsiContoh
-Rata kiri (default adalah rata kanan)|%-10s||Hello |
+Selalu tampilkan tanda pada angka (termasuk +)%+d+42
0Isi dengan nol (berlaku jika lebar ditentukan)%05d00042
#Gunakan format khusus (heksadesimal, oktal)%#x0x2a
Tambahkan spasi di depan angka positif% d 42

Contoh:

fprintf(stdout, "|%-10s|%+05d|%#x|\n", "Left", 42, 42);

Hasil output:

|Left      |+0042|0x2a|

Contoh penerapan praktis

Dengan mengombinasikan lebar, presisi, dan flag, Anda bisa membuat data dalam bentuk tabel yang rapi.

Output data dalam format tabel

Berikut contoh menampilkan nilai siswa dalam format tabel:

#include <stdio.h>

int main() {
    fprintf(stdout, "|%-10s|%5s|%5s|%5s|\n", "Name", "Math", "Eng", "Sci");
    fprintf(stdout, "|%-10s|%5d|%5d|%5d|\n", "Alice", 95, 88, 92);
    fprintf(stdout, "|%-10s|%5d|%5d|%5d|\n", "Bob", 82, 79, 85);
    return 0;
}

Hasil output:

|Name      | Math|  Eng|  Sci|
|Alice     |   95|   88|   92|
|Bob       |   82|   79|   85|

Pemformatan data numerik

Anda bisa menampilkan angka dengan format konsisten agar lebih mudah dibaca.

Contoh:

fprintf(stdout, "Price: $%8.2f\n", 1234.5);
fprintf(stdout, "Discount: %06d%%\n", 25);

Hasil output:

Price: $ 1234.50
Discount: 000025%

Hal yang perlu diperhatikan

  1. Specifier format tidak sesuai
  • Jika specifier tidak cocok dengan tipe data, output bisa tidak sesuai atau error.
  • Contoh: memberikan string pada %d dapat menyebabkan undefined behavior.
  1. Lebar atau presisi berlebihan
  • Jika terlalu besar, output menjadi boros dan bisa membuang resource.

Ringkasan

  • Dengan lebar, presisi, dan flag, output fprintf bisa dikontrol secara detail.
  • Output tabel dan angka bisa dibuat lebih mudah dibaca.
  • Pastikan specifier format sesuai dengan tipe data agar output aman.

4. Operasi file dengan fprintf

Cara membuka file (fopen)

Untuk menulis data ke file dengan fprintf, pertama-tama file harus dibuka. Dalam bahasa C, fungsi fopen digunakan untuk membuka file.

Sintaks dasar fopen

FILE *fopen(const char *filename, const char *mode);
Penjelasan argumen
  • filename: Nama (atau path) file yang akan dibuka.
  • mode: Mode pembukaan file.
  • "r": Baca saja
  • "w": Tulis (file lama akan ditimpa)
  • "a": Tambah (menulis di akhir file)
  • "rb"/"wb"/"ab": Operasi biner (kombinasi baca/tulis/tambah)

Nilai kembalian

  • Jika berhasil, fungsi mengembalikan pointer bertipe FILE.
  • Jika gagal, fungsi mengembalikan NULL.

Contoh penggunaan fopen

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    fclose(file);
    return 0;
}

Program ini membuka file bernama example.txt, menulis data, lalu menutupnya.

Menulis file dengan fprintf

Dengan fprintf, Anda dapat menulis data terformat ke file yang dibuka. Berikut beberapa contoh.

Penulisan dasar ke file

#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    fprintf(file, "Name: %s, Age: %d\n", "Alice", 25);
    fprintf(file, "Name: %s, Age: %d\n", "Bob", 30);

    fclose(file);
    return 0;
}

Isi data.txt:

Name: Alice, Age: 25
Name: Bob, Age: 30

Membuat file CSV

Berikut contoh menulis data dalam format CSV (Comma-Separated Values):

#include <stdio.h>

int main() {
    FILE *file = fopen("students.csv", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    // Baris header
    fprintf(file, "Name,Math,English,Science\n");

    // Baris data
    fprintf(file, "Alice,95,88,92\n");
    fprintf(file, "Bob,82,79,85\n");

    fclose(file);
    return 0;
}

Isi students.csv:

Name,Math,English,Science
Alice,95,88,92
Bob,82,79,85

Menutup file (fclose)

Setelah selesai, file harus ditutup dengan fungsi fclose. Jika tidak, masalah berikut bisa terjadi:

  • Data mungkin tidak sepenuhnya ditulis ke file.
  • Resource sistem akan terbuang.

Sintaks dasar fclose

int fclose(FILE *stream);

Nilai kembalian

  • 0: Berhasil.
  • EOF: Gagal.

Contoh fclose

FILE *file = fopen("example.txt", "w");
if (file != NULL) {
    fprintf(file, "This is a test.\n");
    fclose(file);
}

Tips operasi file yang aman

  1. Selalu periksa pointer file
  • Pastikan hasil fopen tidak NULL.
  1. Jangan lupa menutup file
  • Setiap file yang dibuka harus selalu ditutup dengan fclose.
  1. Penanganan error
  • Periksa error selama operasi file (misalnya disk penuh, izin file ditolak).

Ringkasan

  • Saat menggunakan fprintf untuk file, buka dengan fopen lalu tutup dengan fclose.
  • Pastikan mode pembukaan file dan error handling benar.
  • Dapat digunakan untuk menyimpan data dalam bentuk CSV atau mencatat log.

5. Penanganan Error

Menggunakan nilai balik fprintf untuk penanganan error

Dengan memeriksa nilai balik dari fprintf, Anda bisa menentukan apakah operasi penulisan berhasil atau gagal.

Spesifikasi nilai balik

  • Jika berhasil: mengembalikan jumlah karakter yang ditulis (bilangan bulat positif).
  • Jika gagal: mengembalikan -1.

Contoh pengecekan error dasar

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    int result = fprintf(file, "Hello, World!\n");
    if (result < 0) {
        fprintf(stderr, "Error: Failed to write to file.\n");
    }

    fclose(file);
    return 0;
}

Program ini memeriksa nilai balik fprintf dan menampilkan pesan error jika penulisan gagal.

Menggunakan standar error output (stderr)

stderr digunakan untuk menampilkan error atau peringatan. Dengan mencetak pesan error ke stderr, Anda dapat memisahkan pesan error dari output normal (stdout).

Contoh: mencetak error ke stderr

#include <stdio.h>

int main() {
    FILE *file = fopen("nonexistent_directory/output.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Unable to open file. Check the directory path.\n");
        return 1;
    }

    fclose(file);
    return 0;
}

Hasil output (jika error):

Error: Unable to open file. Check the directory path.

Dengan stderr, pesan error tidak bercampur dengan output utama.

Kode penanganan error praktis

Berikut contoh penanganan error saat operasi file.

Contoh: error saat menulis dan menutup file

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    // proses penulisan
    if (fprintf(file, "Logging data: %d\n", 42) < 0) {
        fprintf(stderr, "Error: Failed to write to file.\n");
        fclose(file);
        return 1;
    }

    // cek error saat menutup file
    if (fclose(file) != 0) {
        fprintf(stderr, "Error: Failed to close the file.\n");
        return 1;
    }

    printf("File operation completed successfully.\n");
    return 0;
}

Poin penting:

  1. Setiap langkah (buka, tulis, tutup) diperiksa error-nya.
  2. Error ditangani dengan menampilkan pesan dan keluar dari program.

Error umum dan cara mengatasinya

1. File tidak bisa dibuka

Penyebab:

  • File tidak ada.
  • Path salah.
  • Tidak ada izin akses.

Solusi:

  • Periksa path file.
  • Atur izin akses.
  • Selalu periksa nilai balik fopen.

2. Penulisan gagal

Penyebab:

  • Disk penuh.
  • File dibuka dalam mode baca saja.

Solusi:

  • Gunakan mode yang benar ("w" atau "a").
  • Pastikan ada cukup ruang di disk.

3. Error saat menutup file

Penyebab:

  • Kekurangan resource sistem.
  • Gangguan perangkat keras.

Solusi:

  • Selalu periksa nilai balik fclose.
  • Minimalkan penggunaan resource saat membuka file.

Ringkasan

  • Dengan memeriksa nilai balik fprintf, error saat menulis dapat dideteksi.
  • Menggunakan stderr memungkinkan pesan error terpisah dari output normal.
  • Penanganan error yang baik pada operasi file meningkatkan keandalan program.

6. Contoh Penerapan

Pembuatan file log otomatis

File log digunakan untuk mencatat status program atau informasi error. Berikut contoh mencatat log dengan tanggal dan waktu.

Contoh: mencetak log dengan tanggal

#include <stdio.h>
#include <time.h>

int main() {
    FILE *logFile = fopen("log.txt", "a"); // buka dalam mode append
    if (logFile == NULL) {
        fprintf(stderr, "Error: Could not open log file.\n");
        return 1;
    }

    time_t now = time(NULL);
    struct tm *localTime = localtime(&now);

    fprintf(logFile, "[%04d-%02d-%02d %02d:%02d:%02d] Program started\n",
            localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
            localTime->tm_hour, localTime->tm_min, localTime->tm_sec);

    fclose(logFile);
    return 0;
}

Isi log.txt:

[2025-01-19 15:45:30] Program started

Poin penting

  • Menggunakan time.h untuk mendapatkan waktu sekarang.
  • Mode append ("a") digunakan agar log ditulis di akhir file.

Menulis data dalam bentuk tabel

Anda dapat mencetak data dalam format tabel yang rapi, berguna untuk laporan atau ekspor data.

Contoh: mencetak nilai siswa

#include <stdio.h>

int main() {
    FILE *file = fopen("report.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    fprintf(file, "|%-10s|%6s|%6s|%6s|\n", "Name", "Math", "Eng", "Sci");
    fprintf(file, "|%-10s|%6d|%6d|%6d|\n", "Alice", 90, 85, 88);
    fprintf(file, "|%-10s|%6d|%6d|%6d|\n", "Bob", 78, 82, 80);

    fclose(file);
    return 0;
}

Isi report.txt:

|Name      | Math|  Eng|  Sci|
|Alice     |   90|   85|   88|
|Bob       |   78|   82|   80|

Poin penting

  • Menggunakan %-10s untuk rata kiri dan %6d untuk rata kanan sehingga tabel terlihat rapi.

Menyimpan data dalam file CSV

CSV (Comma-Separated Values) adalah format umum untuk menyimpan dan bertukar data.

Contoh: menyimpan data ke CSV

#include <stdio.h>

int main() {
    FILE *file = fopen("data.csv", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    // tulis header
    fprintf(file, "Name,Math,English,Science\n");

    // tulis data
    fprintf(file, "Alice,90,85,88\n");
    fprintf(file, "Bob,78,82,80\n");

    fclose(file);
    return 0;
}

Isi data.csv:

Name,Math,English,Science
Alice,90,85,88
Bob,78,82,80

Poin penting

  • Memisahkan field dengan koma (,) agar bisa dibaca dengan Excel atau Python.

Mencatat informasi debugging

Menyimpan log debug memudahkan pelacakan status program.

Contoh: mencatat variabel runtime

#include <stdio.h>

int main() {
    FILE *debugFile = fopen("debug.log", "w");
    if (debugFile == NULL) {
        fprintf(stderr, "Error: Could not open debug log file.\n");
        return 1;
    }

    int x = 42;
    fprintf(debugFile, "Debug: Variable x = %d\n", x);

    fclose(debugFile);
    return 0;
}

Isi debug.log:

Debug: Variable x = 42

Poin penting

  • Dengan menyimpan informasi debug ke file, masalah program lebih mudah dilacak.

Ringkasan

  • fprintf dapat digunakan untuk membuat log, tabel, dan file CSV.
  • Dalam praktik, log dengan timestamp dan format CSV sangat berguna.
  • Dengan contoh-contoh ini, Anda bisa lebih efektif memanfaatkan fprintf.

7. Pertanyaan yang Sering Diajukan (FAQ)

1. Apa perbedaan antara fprintf dan printf?

Jawaban

  • printf:
  • Mencetak data ke output standar (biasanya konsol).
  • Tidak bisa mengubah tujuan output.
  • fprintf:
  • Bisa menentukan tujuan output (misalnya file, stdout, stderr, dll.).
  • Memberikan fleksibilitas lebih.

Contoh

#include <stdio.h>

int main() {
    printf("This is printed to the console.\n"); // selalu ke stdout

    FILE *file = fopen("output.txt", "w");
    if (file != NULL) {
        fprintf(file, "This is written to a file.\n"); // output ke file
        fclose(file);
    }
    return 0;
}

2. Bagaimana cara mencetak teks Jepang dengan benar menggunakan fprintf?

Jawaban

  • Agar teks Jepang ditampilkan dengan benar, perlu memperhatikan hal berikut:
  1. Encoding karakter:
    • Gunakan encoding yang sesuai dengan lingkungan (misalnya UTF-8 atau Shift-JIS).
  2. Encoding file:
    • Pastikan encoding file cocok dengan encoding sistem.

Contoh: mencetak teks Jepang dengan UTF-8

#include <stdio.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, ""); // set locale

    FILE *file = fopen("japanese.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    fprintf(file, "こんにちは、世界!\n");
    fclose(file);
    return 0;
}

Catatan:

  • Pada beberapa sistem, perlu secara eksplisit mengatur encoding agar teks tidak rusak (misalnya Shift-JIS di Windows).

3. Apa penyebab umum error pada fprintf?

Jawaban

  • Penyebab umum error antara lain:
  1. File tidak bisa dibuka:
    • Path salah.
    • Izin akses tidak cukup.
  2. Disk penuh:
    • Ruang penyimpanan habis saat menulis.
  3. Specifier format tidak cocok:
    • Tipe data tidak sesuai dengan format yang digunakan.

Contoh: specifier format tidak cocok

#include <stdio.h>

int main() {
    FILE *file = fopen("error.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    // Error: menggunakan %s tapi memberi integer
    fprintf(file, "%s", 42);
    fclose(file);
    return 0;
}

Solusi:

  • Pastikan specifier sesuai dengan tipe data (%d untuk integer, %s untuk string).

4. Apa efek buffering pada fprintf?

Jawaban

  • Buffering:
  • Data sementara disimpan di buffer dan baru ditulis ke file saat buffer penuh atau setelah fclose/fflush dipanggil.
  • Masalah:
  • Jika program crash, data dalam buffer bisa hilang.

Solusi

  1. Gunakan fflush:
  • Flush buffer agar data langsung ditulis ke file.
  1. Contoh penggunaan fflush
#include <stdio.h>

int main() {
    FILE *file = fopen("buffered_output.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    fprintf(file, "Buffered data.\n");
    fflush(file); // tulis langsung ke file

    fclose(file);
    return 0;
}

5. Bagaimana cara mengatasi output file yang terputus di tengah?

Jawaban

  • Penyebab umum output terputus:
  1. File tidak ditutup:
    • Buffer tidak diflush sehingga data hilang.
  2. Disk penuh:
    • Ruang penyimpanan habis saat menulis.

Contoh: menutup file dengan benar

#include <stdio.h>

int main() {
    FILE *file = fopen("partial_output.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open file.\n");
        return 1;
    }

    fprintf(file, "This is complete data.\n");

    // jangan lupa fclose
    fclose(file);
    return 0;
}

Solusi:

  • Selalu panggil fclose setelah menulis.
  • Periksa nilai balik saat error terjadi.

Ringkasan

  • fprintf fleksibel, tapi perlu penanganan error dan encoding yang benar.
  • FAQ ini membantu mencegah error umum saat menggunakan fprintf.

8. Output ke Banyak File Secara Bersamaan

Dengan memanfaatkan fprintf, Anda dapat menulis data ke beberapa file sekaligus. Bagian ini menjelaskan cara praktis melakukan hal tersebut.

Struktur dasar untuk menangani banyak file

Dalam bahasa C, Anda bisa menggunakan beberapa pointer FILE untuk mengoperasikan banyak file sekaligus. Setiap file harus dibuka dengan fopen, ditulis dengan fprintf, lalu ditutup dengan fclose.

Contoh dasar: menulis ke 2 file sekaligus

#include <stdio.h>

int main() {
    // buka 2 file
    FILE *file1 = fopen("output1.txt", "w");
    FILE *file2 = fopen("output2.txt", "w");

    if (file1 == NULL || file2 == NULL) {
        fprintf(stderr, "Error: Could not open one of the files.\n");
        if (file1) fclose(file1);
        if (file2) fclose(file2);
        return 1;
    }

    // tulis ke file1
    fprintf(file1, "This is the first file.\n");

    // tulis ke file2
    fprintf(file2, "This is the second file.\n");

    // tutup kedua file
    fclose(file1);
    fclose(file2);

    printf("Data written to both files successfully.\n");
    return 0;
}

Isi output1.txt:

This is the first file.

Isi output2.txt:

This is the second file.

Poin penting

  1. Cek error: Pastikan setiap fopen berhasil.
  2. Lepaskan resource: Semua file harus ditutup dengan fclose.

Operasi file dinamis

Anda dapat membuat nama file secara dinamis dan menulis data ke banyak file dengan loop.

Contoh: nama file dinamis

#include <stdio.h>

int main() {
    char filename[20];
    for (int i = 1; i <= 3; i++) {
        // buat nama file dinamis
        sprintf(filename, "file%d.txt", i);

        FILE *file = fopen(filename, "w");
        if (file == NULL) {
            fprintf(stderr, "Error: Could not open %s\n", filename);
            continue;
        }

        fprintf(file, "This is file number %d\n", i);
        fclose(file);
    }

    printf("Data written to files successfully.\n");
    return 0;
}

File yang dibuat:

  • file1.txt: This is file number 1
  • file2.txt: This is file number 2
  • file3.txt: This is file number 3

Poin penting

  • Gunakan sprintf untuk membuat nama file dinamis.
  • Lanjutkan loop meskipun ada error agar file lain tetap dibuat.

Menulis paralel ke banyak file

Untuk menulis data besar ke beberapa file sekaligus, Anda bisa menggunakan thread agar operasi berjalan paralel.

Contoh: menulis dengan thread (pthread)

#include <stdio.h>
#include <pthread.h>

void *write_to_file(void *arg) {
    char *filename = (char *)arg;
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        fprintf(stderr, "Error: Could not open %s\n", filename);
        return NULL;
    }

    fprintf(file, "Data written to %s\n", filename);
    fclose(file);
    return NULL;
}

int main() {
    pthread_t threads[3];
    char *filenames[] = {"thread1.txt", "thread2.txt", "thread3.txt"};

    for (int i = 0; i < 3; i++) {
        pthread_create(&threads[i], NULL, write_to_file, filenames[i]);
    }

    for (int i = 0; i < 3; i++) {
        pthread_join(threads[i], NULL);
    }

    printf("Data written to all files in parallel.\n");
    return 0;
}

File yang dibuat:

  • thread1.txt: Data written to thread1.txt
  • thread2.txt: Data written to thread2.txt
  • thread3.txt: Data written to thread3.txt

Poin penting

  • Dengan thread, data bisa ditulis paralel ke banyak file.
  • Gunakan pthread_join untuk sinkronisasi.

Ringkasan

  • fprintf bisa digunakan untuk menulis ke banyak file secara bersamaan.
  • Nama file bisa dibuat dinamis, atau gunakan thread untuk performa lebih baik.
  • Selalu perhatikan manajemen resource (fclose, error handling).

9. Referensi

 

侍エンジニア塾