Saya mencoba meneliti perbedaan antara cout
, cerr
dan clog
di internet tetapi tidak dapat menemukan jawaban yang sempurna. Saya masih belum jelas kapan harus menggunakan yang mana. Adakah yang bisa menjelaskan kepada saya, melalui program sederhana dan menggambarkan situasi yang sempurna kapan harus menggunakan yang mana?
Saya mengunjungi situs ini yang menunjukkan program kecil di cerr
dan clog
, tetapi hasil yang diperoleh di sana juga dapat diperoleh dengan menggunakan cout
. Jadi, saya bingung tentang penggunaan persis masing-masing.
stdout
,,stdin
(untukcin
), danstderr
yang digunakan secara default. Saya percayaclog
hanyacerr
dengan perubahan buffering.Jawaban:
stdout
danstderr
merupakan aliran yang berbeda, meskipun keduanya merujuk ke keluaran konsol secara default. Pengalihan (piping) salah satunya (mis.program.exe >out.txt
) Tidak akan memengaruhi yang lain.Umumnya,
stdout
harus digunakan untuk keluaran program yang sebenarnya, sementara semua informasi dan pesan kesalahan harus dicetak kestderr
, sehingga jika pengguna mengarahkan keluaran ke file, pesan informasi masih dicetak di layar dan bukan ke file keluaran.sumber
Umumnya Anda menggunakan
std::cout
untuk keluaran normal,std::cerr
untuk kesalahan, danstd::clog
untuk "logging" (yang bisa berarti apa pun yang Anda inginkan).Perbedaan utamanya
std::cerr
adalah tidak buffer seperti dua lainnya.Dalam kaitannya dengan C lama
stdout
danstderr
,std::cout
sesuai denganstdout
, sementarastd::cerr
danstd::clog
keduanya sesuai denganstderr
(kecuali yang distd::clog
-buffer).sumber
clog
juga menghasilkancerr
. Jadi berdasarkan itu, mana yang kamu pilih? Jikaclog
biasanya untuk "logging", mengapa saya ingin itu masuk ke aliran kesalahan? Log tampak lebih seperti "log normal" (aliascout
) daripada kesalahan.cerr
danclog
menggunakan output "error" standar, tetapiclog
buffered yang mungkin mengapa tampaknya lebih seperti itucout
. Yang mana yang dipilih untuk keluaran kesalahan? Tergantung saya kira, pada lebih banyak alasan daripada yang bisa saya sebutkan dan itu harus diputuskan dari kasus ke kasus.Aliran keluaran standar (cout):
cout
adalah turunan dariostream
kelas.cout
digunakan untuk menghasilkan keluaran pada perangkat keluaran standar yang biasanya merupakan layar tampilan. Data yang diperlukan untuk ditampilkan di layar disisipkan dalam aliran keluaran standar (cout
) menggunakan operator penyisipan (<<
).Aliran kesalahan standar tanpa buffer (cerr):
cerr
adalah aliran kesalahan standar yang digunakan untuk mengeluarkan kesalahan. Ini juga merupakan turunan dariostream
kelas. Seperticerr
adalah un-buffered sehingga digunakan ketika kita perlu untuk menampilkan pesan kesalahan segera. Itu tidak memiliki buffer untuk menyimpan pesan kesalahan dan ditampilkan nanti.Buffered standard error stream (clog): Ini juga merupakan turunan dari
ostream
kelas dan digunakan untuk menampilkan kesalahan tetapi tidak seperticerr
kesalahan yang pertama kali dimasukkan ke dalam buffer dan disimpan dalam buffer sampai tidak terisi penuh.bacaan lebih lanjut: basic-input-output-c
sumber
Perbedaan dari 3 aliran ini adalah buffering.
Silakan periksa kode berikut, dan jalankan DEBUG melalui 3 baris: f (std :: clog), f (std :: cerr), f (std :: out), kemudian buka 3 file keluaran untuk melihat apa yang terjadi. Anda dapat menukar 3 baris ini untuk melihat apa yang akan terjadi.
sumber
sumber
Dari draf dokumen standar C ++ 17:
Diskusi...
cout
menulis kestdout
;cerr
danclog
untukstderr
Standard Out (
stdout
) dimaksudkan untuk menerima output non-error, non-diagnostik dari program, seperti output dari pemrosesan yang berhasil yang dapat ditampilkan ke pengguna akhir atau dialirkan ke beberapa tahap pemrosesan lebih lanjut.Kesalahan Standar (
stderr
) dimaksudkan untuk keluaran diagnostik, seperti peringatan dan pesan kesalahan yang menunjukkan bahwa program belum atau mungkin tidak menghasilkan keluaran yang diharapkan pengguna. Masukan ini dapat ditampilkan ke pengguna akhir meskipun data keluaran disalurkan ke tahap pemrosesan lebih lanjut.cin
dancerr
terikatcout
Keduanya membilas
cout
sebelum menangani sendiri operasi I / O. Ini memastikan prompt yang dikirim kecout
terlihat sebelum blok program untuk membaca inputcin
, dan bahwa output sebelumnya kecout
dihapus sebelum menulis kesalahancerr
, yang membuat pesan dalam urutan kronologis pembuatannya ketika keduanya diarahkan ke terminal / file / yang sama dll ..Ini kontras dengan
clog
- jika Anda menulis di sana, itu tidak akan di-buffer dan tidak terikat pada apa pun, jadi itu akan menyangga logging dalam jumlah yang layak sebelum dibilas. Ini menghasilkan throughput pesan tertinggi, tetapi berarti pesan mungkin tidak segera terlihat oleh calon konsumen yang membaca terminal atau mengikuti log.sumber
Baik cout dan clog di -buffer tetapi cerr tidak di-buffer dan semua ini adalah objek yang telah ditentukan sebelumnya yang merupakan instance dari kelas ostream. Penggunaan dasar dari ketiganya adalah cout digunakan untuk input standar sedangkan clog dan cerr digunakan untuk menunjukkan kesalahan. Poin utama mengapa cerr adalah un-buffered adalah mungkin karena misalkan Anda memiliki beberapa output dalam buffer dan pengecualian kesalahan disebutkan dalam kode maka Anda perlu menampilkan kesalahan itu segera yang dapat dilakukan oleh cerr secara efektif.
Tolong koreksi saya jika saya salah.
sumber