Menu

Input dan Output C++: cin, cout, getline, dan Stream

Cara kerja I/O konsol di C++: mencetak dengan cout, membaca dengan cin, bug klasik baris baru saat getline dipakai setelah cin, dan cara memulihkan input yang gagal.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Cara C++ Berbicara dengan Konsol

C++ melakukan I/O konsol lewat stream dari header <iostream>. Kamu menulis ke luar dengan cout (character output) dan membaca dari pengguna dengan cin (character input). Keduanya memakai dua operator yang sudah kamu lihat sebagai bit-shift, yang di sini dipakai untuk tujuan lain:

  • << adalah operator insertion: ia mengirim data ke dalam cout.
  • >> adalah operator extraction: ia menarik data keluar dari cin ke dalam sebuah variabel.

Cara mudah mengingat arahnya: panah menunjuk ke arah data mengalir. Sekarang setelah kamu bisa menyimpan teks di string, mari kita alirkan teks itu masuk dan keluar dari programmu.

Mencetak dengan cout

cout mengirim apa pun yang kamu sisipkan ke output standar. Kamu bisa merangkai beberapa << dalam satu pernyataan, mencampur teks, angka, dan variabel dengan bebas.

Setiap << menambahkan ke baris yang sama sampai kamu menyisipkan baris baru. Ada dua cara melakukannya: '\n' menyisipkan karakter baris baru, sedangkan endl menyisipkan baris baru dan melakukan flush buffer ke layar. Flush punya biaya nyata, jadi di dalam loop yang mencetak ribuan baris, utamakan '\n': stream akan melakukan flush sendiri saat dibutuhkan (dan selalu saat program keluar).

// Fine for a one-off message:
cout << "Done" << endl;

// In a hot loop, prefer this - no forced flush each iteration:
for (int i = 0; i < 1000000; ++i)
    cout << i << '\n';

Membaca dengan cin dan >>

cin >> variable membaca satu token yang dipisahkan whitespace dan mengonversinya ke tipe variabel itu. Ia melewati spasi atau baris baru di depan, lalu berhenti di whitespace berikutnya.

Karena >> berhenti di whitespace, ia bagus untuk angka satu per satu dan kata tunggal, tetapi tidak berguna untuk kalimat utuh: cin >> word pada input hello world hanya membaca hello dan meninggalkan world di buffer untuk pembacaan berikutnya.

Membaca Satu Baris Utuh dengan getline

Untuk menangkap satu baris utuh beserta spasinya, pakai getline(cin, line), yang membaca semuanya sampai tombol Enter ke dalam std::string.

Ini alat yang tepat setiap kali input bisa berisi spasi: nama, alamat, kalimat. Hanya ada satu jebakan yang menunggumu begitu kamu mencampur getline dengan >>.

Halaman getline membahas fungsi ini secara tersendiri: delimiter sendiri, membaca sampai akhir input, dan membaca file baris demi baris dengan std::ifstream.

Jebakan Baris Baru pada cin + getline

Inilah bug I/O C++ yang paling umum. Saat kamu menjalankan cin >> n, extraction membaca angkanya tetapi meninggalkan baris baru (tombol Enter yang kamu tekan) di buffer input. getline berikutnya langsung melihat baris baru yang tertinggal itu, menganggap barisnya sudah selesai, dan memberimu string kosong tanpa pernah berhenti menunggu input.

int age;
string city;

cin >> age;            // you type 30 and press Enter; '\n' stays in the buffer
getline(cin, city);    // reads the leftover '\n' -> city is "" (empty!)

Perbaikannya adalah membuang baris baru yang tertinggal itu dengan cin.ignore setelah >> dan sebelum getline:

cin.ignore(numeric_limits<streamsize>::max(), '\n') melewati karakter sampai ia menelan satu baris baru (atau mencapai akhir input). Inilah versi yang andal: cin.ignore() yang lebih pendek hanya membuang satu karakter, yang gagal kalau pengguna mengetik spasi tambahan setelah angka. Biasakan memakai bentuk lengkapnya.

Saat Input Gagal

Kalau pengguna mengetik huruf padahal yang diharapkan angka, extraction gagal: cin masuk ke keadaan error dan variabel tujuannya tidak berubah (diisi 0 sejak C++11). Lebih buruk lagi, begitu cin berada dalam keadaan gagal, setiap pembacaan sesudahnya juga dilewati diam-diam, sehingga kamu bisa terjebak dalam infinite loop.

Pemulihannya selalu dua langkah: cin.clear() mengatur ulang flag error supaya stream bisa dipakai lagi, dan cin.ignore(...) membuang karakter bermasalah yang masih tersangkut di buffer. Lewatkan ignore, dan input yang salah tetap di tempatnya, sehingga >> berikutnya gagal lagi: infinite loop yang klasik. Mengecek cin >> n langsung di dalam kondisi berfungsi karena stream dikonversi menjadi false saat berada dalam keadaan gagal.

Kesalahan Umum yang Perlu Dihindari

  • Memakai cin >> s untuk sebuah kalimat. Ia berhenti di spasi pertama. Pakai getline untuk apa pun yang berisi spasi.
  • Lupa cin.ignore di antara >> dan getline. Baris baru yang tertinggal memberimu baris kosong. Kosongkan buffer-nya dulu.
  • Memakai endl di mana-mana. Setiap pemakaiannya memaksa flush. Jadikan '\n' sebagai default dan simpan endl untuk saat output benar-benar harus muncul sekarang.
  • Mengabaikan cin yang gagal. Huruf pada pembacaan angka membuat cin rusak; selalu panggil clear() lalu ignore() sebelum membaca lagi.

Pertanyaan yang sering diajukan

Kenapa getline melewatkan input tepat setelah memakai cin di C++?

cin >> x membaca angkanya, tetapi meninggalkan baris baru dari tombol Enter yang kamu tekan di buffer. getline berikutnya membaca sampai baris baru yang tertinggal itu dan langsung mengembalikan string kosong. Buang dulu dengan cin.ignore(numeric_limits<streamsize>::max(), '\n'); setelah >> dan sebelum getline.

Apa perbedaan endl dan \n di C++?

Keduanya mengakhiri baris, tetapi endl juga mengosongkan (flush) buffer output ke layar, sedangkan '\n' hanya menyisipkan baris baru. Flush itu ada biayanya: di loop yang ketat, utamakan '\n' dan biarkan stream melakukan flush sendiri. Pakai endl hanya saat kamu benar-benar butuh output-nya muncul saat itu juga.

Bagaimana cara membaca satu baris teks utuh termasuk spasinya di C++?

Pakai getline(cin, line), bukan cin >> line. Operator >> berhenti di whitespace pertama, jadi ia hanya mengambil satu kata. getline membaca semuanya sampai tombol Enter ke dalam std::string, termasuk spasinya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai