Belajar C Language - Input/Output & File Handling
Episode 8 of 24

Belajar C Language - Input/Output & File Handling

Episode ini menguasai input-output C: printf, scanf, getchar, dan putchar untuk standard I/O, lalu fopen, fread, fwrite, fprintf, fgets, dan fclose untuk file handling. Kalian juga akan memahami mode file serta error handling dengan errno dan perror.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Sebuah program yang tidak berkomunikasi dengan dunia luar nyaris tidak berguna. Episode 8 membahas input-output: bagaimana program membaca dari keyboard dan menulis ke layar, serta bagaimana membaca dan menulis file di disk.

Standard I/O bekerja lewat stream: stdin untuk input, stdout dan stderr untuk output. File diakses lewat FILE *, sebuah struktur yang dibuka dengan fopen dan wajib ditutup dengan fclose.

Di dunia nyata, I/O adalah sumber error paling banyak: file tidak ada, izin ditolak, atau disk penuh. Karena itu episode ini juga membahas penanganan error dengan errno dan perror — keterampilan yang akan terus dipakai di episode 12 saat menangani network I/O.

Standard I/O: printf, scanf, getchar, putchar

Mencetak Output dengan printf

Fungsi printf sudah tidak asing. Format string menentukan bagaimana nilai diformat: %d untuk int, %f untuk double, %s untuk string, dan %zu untuk size_t. Format string bisa berisi spasi, teks, dan escape seperti \n untuk baris baru.

Membaca Input dengan scanf

Fungsi scanf membaca input terformat. Karena C memakai passing by value, scanf membutuhkan alamat variabel tujuan melalui &:

Membaca input terformat
cat > input.c <<'EOF'
#include <stdio.h>
 
int main(void) {
    char nama[64];
    int umur;
    printf("Nama: ");
    fgets(nama, sizeof(nama), stdin);
    printf("Umur: ");
    if (scanf("%d", &umur) != 1) {
        return 1;
    }
    printf("Halo %sumur %d\n", nama, umur);
    return 0;
}
EOF
gcc -Wall -Wextra input.c -o input && ./input

Pola scanf("%d", &umur) menulis hasil ke alamat umur dan mengembalikan jumlah item yang berhasil dibaca. Periksa nilai kembalian ini; scanf yang mengembalikan bukan 1 menandakan input tidak sesuai. Untuk baris teks, fgets lebih aman daripada scanf karena membatasi panjang buffer.

getchar dan putchar

Untuk membaca dan menulis satu karakter, gunakan getchar dan putchar. Keduanya berguna untuk memproses teks karakter per karakter tanpa buffer format:

Salin satu karakter
int c;
while ((c = getchar()) != EOF) {
    putchar(c);
}

Pola while ((c = getchar()) != EOF) membaca hingga akhir input. Perhatikan c bertipe int, bukan char, agar bisa menyimpan EOF yang bernilai negatif.

File I/O: fopen, fread, fwrite, fprintf, fgets, fclose

Membuka dan Menutup File

File dibuka dengan fopen, yang menerima nama file dan mode. Setiap file yang dibuka harus ditutup dengan fclose:

Menulis file teks
cat > tulis_file.c <<'EOF'
#include <stdio.h>
 
int main(void) {
    FILE *f = fopen("catatan.txt", "w");
    if (f == NULL) {
        perror("fopen");
        return 1;
    }
    fprintf(f, "Baris pertama\n");
    fprintf(f, "Baris kedua\n");
    fclose(f);
    return 0;
}
EOF
gcc -Wall -Wextra tulis_file.c -o tulis_file && ./tulis_file

fopen("catatan.txt", "w") membuka file dalam mode tulis yang menimpa isi lama. Selalu periksa hasil fopen; nilai NULL berarti pembukaan gagal. fprintf bekerja seperti printf tetapi menulis ke file, dan fclose menulis buffer tersisa ke disk.

Membaca File dengan fgets dan fread

Untuk membaca teks baris per baris, gunakan fgets. Untuk data biner, gunakan fread dan fwrite yang membaca atau menulis blok byte:

Membaca file teks
cat > baca_file.c <<'EOF'
#include <stdio.h>
 
int main(void) {
    FILE *f = fopen("catatan.txt", "r");
    char baris[256];
    if (f == NULL) {
        perror("fopen");
        return 1;
    }
    while (fgets(baris, sizeof(baris), f) != NULL) {
        printf("%s", baris);
    }
    fclose(f);
    return 0;
}
EOF
gcc -Wall -Wextra baca_file.c -o baca_file && ./baca_file

Loop while (fgets(baris, sizeof(baris), f) != NULL) membaca sampai akhir file, saat fgets mengembalikan NULL. Ukuran sizeof(baris) membatasi jumlah karakter yang dibaca sehingga tidak terjadi buffer overflow.

File Pointer dan Mode File

Mode Membuka File

Parameter mode menentukan operasi yang diizinkan:

  • "r": baca, file harus sudah ada.
  • "w": tulis, menimpa atau membuat baru.
  • "a": tambah di akhir, membuat baru jika belum ada.
  • "rb" dan "wb": baca dan tulis dalam mode biner.
  • "r+", "w+", "a+": kombinasi baca dan tulis.

Mode biner penting untuk data non-teks karena Windows mengubah baris baru secara berbeda dibanding Linux. Di Linux, mode teks dan biner identik.

Posisi di Dalam File

Fungsi ftell dan fseek membaca dan mengubah posisi baca-tulis di dalam file. fseek(f, offset, SEEK_SET) memindahkan posisi ke offset dari awal file, dan rewind mengembalikan posisi ke awal. Ini berguna untuk mengakses data biner pada offset tertentu, misalnya header suatu format file.

Error Handling I/O dengan errno, perror

errno dan perror

Saat fungsi I/O gagal, variabel global errno diisi kode error, dan perror mencetak pesan yang bisa dibaca manusia:

Menangani error I/O
cat > error_io.c <<'EOF'
#include <stdio.h>
#include <errno.h>
 
int main(void) {
    FILE *f = fopen("tidak-ada.txt", "r");
    if (f == NULL) {
        perror("Gagal membuka file");
        return 1;
    }
    fclose(f);
    return 0;
}
EOF
gcc -Wall -Wextra error_io.c -o error_io && ./error_io

perror("Gagal membuka file") mencetak pesan kalian diikuti deskripsi error seperti "No such file or directory". errno bisa dibaca langsung untuk menangani kasus berbeda secara terpisah.

Disiplin Penanganan Error

Periksa nilai kembalian setiap operasi I/O: fopen, fgets, fread, fwrite, dan fclose semuanya bisa gagal. Jangan menulis kode yang mengasumsikan I/O selalu sukses. Error yang tertangkap lebih awal jauh lebih murah daripada crash di produksi.

Tip

Bersihkan resource di jalur sukses maupun gagal. Pola yang umum adalah membuka file, memproses, dan memastikan fclose dipanggil sebelum setiap return — termasuk saat terjadi error.

Penutup

Inti yang harus dibawa pulang:

  • printf, scanf, getchar, dan putchar menangani standard I/O dasar.
  • Periksa nilai kembalian scanf dan fgets untuk input yang valid.
  • fopen membuka file, fclose wajib menutupnya.
  • fgets untuk teks, fread dan fwrite untuk data biner.
  • Mode file menentukan operasi yang diizinkan.
  • errno dan perror menjelaskan penyebab kegagalan I/O.

Di episode 9 selanjutnya kita akan membahas data structures dan algorithms dasar — linked list, stack, dan queue, penggunaan array dan pointer dalam struktur data, sorting dasar bubble, insertion, dan selection sort, serta searching linear dan binary dengan kompleksitas sederhana.

Belajar C Language - Input/Output & File Handling | Belajar C Language