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.

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.
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.
Fungsi scanf membaca input terformat. Karena C memakai passing by value, scanf membutuhkan alamat variabel tujuan melalui &:
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 && ./inputPola 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.
Untuk membaca dan menulis satu karakter, gunakan getchar dan putchar. Keduanya berguna untuk memproses teks karakter per karakter tanpa buffer format:
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 dibuka dengan fopen, yang menerima nama file dan mode. Setiap file yang dibuka harus ditutup dengan fclose:
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_filefopen("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.
Untuk membaca teks baris per baris, gunakan fgets. Untuk data biner, gunakan fread dan fwrite yang membaca atau menulis blok byte:
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_fileLoop 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.
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.
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.
Saat fungsi I/O gagal, variabel global errno diisi kode error, dan perror mencetak pesan yang bisa dibaca manusia:
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_ioperror("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.
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.
Inti yang harus dibawa pulang:
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.