จากเอกสารมาตรฐาน C ++ 17 แบบร่าง:
30.4.3 วัตถุสตรีมแคบ [narrow.stream.objects]
istream cin;
1 อ็อบเจ็กต์cin
ควบคุมอินพุตจากบัฟเฟอร์สตรีมที่เกี่ยวข้องกับอ็อบเจ็กต์stdin
ประกาศใน<cstdio>
(30.11.1)
2 หลังจากที่วัตถุที่cin
จะเริ่มต้นได้ผลตอบแทนcin.tie()
&cout
สถานะเป็นอย่างอื่นเหมือนกับที่กำหนดไว้สำหรับbasic_ios<char>::init
(30.5.5.2)
ostream cout;
3 อ็อบเจ็กต์cout
ควบคุมเอาต์พุตไปยังสตรีมบัฟเฟอร์ที่เกี่ยวข้องกับอ็อบเจ็กต์stdout
ประกาศใน<cstdio>
(30.11.1)
ostream cerr;
4 อ็อบเจ็กต์cerr
ควบคุมเอาต์พุตไปยังสตรีมบัฟเฟอร์ที่เกี่ยวข้องกับอ็อบเจ็กต์stderr
ประกาศใน<cstdio>
(30.11.1)
5 หลังจากที่วัตถุที่cerr
จะเริ่มต้น, cerr.flags() & unitbuf
ไม่ใช่ศูนย์และผลตอบแทนcerr.tie()
&cout
สถานะเป็นอย่างอื่นเหมือนกับที่กำหนดไว้สำหรับbasic_ios<char>::init
(30.5.5.2)
ostream clog;
6 อ็อบเจ็กต์clog
ควบคุมเอาต์พุตไปยังสตรีมบัฟเฟอร์ที่เกี่ยวข้องกับอ็อบเจ็กต์stderr
ประกาศใน<cstdio>
(30.11.1)
อภิปรายผล...
cout
เขียนถึงstdout
; cerr
และclog
ถึงstderr
Standard Out ( stdout
) มีไว้เพื่อรับเอาต์พุตที่ไม่ใช่ข้อผิดพลาดและไม่ใช่การวินิจฉัยจากโปรแกรมเช่นเอาต์พุตจากการประมวลผลที่สำเร็จซึ่งสามารถแสดงต่อผู้ใช้ปลายทางหรือสตรีมไปยังขั้นตอนการประมวลผลเพิ่มเติม
ข้อผิดพลาดมาตรฐาน ( stderr
) มีไว้สำหรับเอาต์พุตการวินิจฉัยเช่นคำเตือนและข้อความแสดงข้อผิดพลาดที่ระบุว่าโปรแกรมไม่ได้หรืออาจไม่ได้สร้างเอาต์พุตที่ผู้ใช้อาจคาดหวัง อินพุตนี้อาจแสดงต่อผู้ใช้แม้ว่าข้อมูลเอาต์พุตจะถูกส่งไปยังขั้นตอนการประมวลผลเพิ่มเติม
cin
และcerr
เชื่อมโยงกับcout
ทั้งสองล้างcout
ก่อนที่จะจัดการการดำเนินงาน I / O ด้วยตนเอง สิ่งนี้ทำให้มั่นใจได้ว่าพร้อมต์ที่ส่งถึงcout
จะมองเห็นได้ก่อนที่โปรแกรมจะบล็อกเพื่ออ่านอินพุตจากcin
และเอาต์พุตก่อนหน้านี้จะcout
ถูกล้างก่อนที่จะเขียนข้อผิดพลาดผ่านcerr
ซึ่งจะเก็บข้อความตามลำดับเวลาของการสร้างเมื่อทั้งสองถูกส่งไปยังเทอร์มินัล / ไฟล์ / เดียวกัน ฯลฯ ..
สิ่งนี้ตรงกันข้ามกับclog
- ถ้าคุณเขียนที่นั่นมันจะไม่ถูกบัฟเฟอร์และไม่ผูกติดกับอะไรเลยดังนั้นมันจะบัฟเฟอร์การบันทึกในปริมาณที่เหมาะสมก่อนที่จะล้างออก สิ่งนี้ให้ปริมาณงานสูงสุดของข้อความ แต่หมายความว่าข้อความอาจไม่สามารถมองเห็นได้อย่างรวดเร็วสำหรับผู้บริโภคที่อ่านเทอร์มินัลหรือกำหนดส่วนท้ายของบันทึก
stdout
,stdin
(สำหรับcin
) และstderr
ใช้โดยค่าเริ่มต้น ฉันเชื่อว่าclog
เป็นเพียงcerr
การเปลี่ยนแปลงบัฟเฟอร์