Saya ingat pernah membaca tentang ini dalam standar, jadi begini:
Lihat standar C11 yang mendefinisikan bagaimana stream standar berperilaku, ketika program C ++ antarmuka CRT, standar C11 harus mengatur kebijakan pembilasan di sini.
ISO / IEC 9899: 201x
7.21.3 §7
Pada startup program, tiga stream teks sudah ditentukan sebelumnya dan tidak perlu dibuka secara eksplisit - input standar (untuk membaca input konvensional), output standar (untuk menulis output konvensional), dan standard error (untuk menulis output diagnostik). Seperti yang awalnya dibuka, aliran kesalahan standar tidak sepenuhnya buffered; input standar dan output stream standar sepenuhnya buffered jika dan hanya jika aliran dapat ditentukan untuk tidak merujuk ke perangkat interaktif.
7.21.3 §3
Ketika aliran tidak ditemukan, karakter dimaksudkan untuk muncul dari sumber atau di tujuan sesegera mungkin. Kalau tidak, karakter dapat diakumulasikan dan dikirim ke atau dari lingkungan host sebagai blok. Ketika aliran sepenuhnya buffered, karakter dimaksudkan untuk dikirim ke atau dari lingkungan host sebagai blok ketika buffer diisi. Ketika aliran buffer line, karakter dimaksudkan untuk dikirim ke atau dari lingkungan host sebagai blok ketika karakter baris baru ditemui. Selain itu, karakter dimaksudkan untuk ditransmisikan sebagai blok ke lingkungan host ketika buffer diisi, ketika input diminta pada stream yang tidak dikonstruksikan, atau ketika input diminta pada jalur buffered stream yang membutuhkan transmisi karakter dari lingkungan host .
Ini berarti bahwa std::cout
dan std::cin
sepenuhnya buffered jika dan hanya jika mereka merujuk ke perangkat non-interaktif. Dengan kata lain, jika stdout dilampirkan ke terminal maka tidak ada perbedaan perilaku.
Namun, jika std::cout.sync_with_stdio(false)
dipanggil, maka '\n'
tidak akan menyebabkan flush bahkan ke perangkat interaktif. Sebaliknya '\n'
setara dengan std::endl
kecuali pemipaan ke file: c ++ ref on std :: endl .