ฉันจำได้ว่าอ่านเรื่องนี้เป็นมาตรฐานดังนั้นต่อไปนี้:
ดูมาตรฐาน C11 ซึ่งกำหนดวิธีการทำงานของสตรีมมาตรฐานในขณะที่โปรแกรม C ++ เชื่อมต่อกับ CRT มาตรฐาน C11 ควรควบคุมนโยบายการชำระล้างที่นี่
ISO / IEC 9899: 201x
7.21.3 §7
เมื่อเริ่มต้นโปรแกรมสตรีมข้อความสามแบบจะถูกกำหนดไว้ล่วงหน้าและไม่จำเป็นต้องเปิดอย่างชัดเจน - อินพุตมาตรฐาน (สำหรับการอ่านอินพุตดั้งเดิม), เอาต์พุตมาตรฐาน (สำหรับการเขียนเอาต์พุตทั่วไป) และข้อผิดพลาดมาตรฐาน (สำหรับการเขียนเอาต์พุตการวินิจฉัย) เมื่อเปิดครั้งแรกสตรีมข้อผิดพลาดมาตรฐานจะไม่ถูกบัฟเฟอร์อย่างสมบูรณ์ อินพุตมาตรฐานและสตรีมเอาต์พุตมาตรฐานจะถูกบัฟเฟอร์อย่างสมบูรณ์หากว่าสามารถกำหนดสตรีมไม่ให้อ้างอิงถึงอุปกรณ์แบบโต้ตอบได้
7.21.3 §3
เมื่อไม่มีการสตรีมตัวอักษรจะมีเจตนาให้ปรากฏจากแหล่งที่มาหรือที่ปลายทางโดยเร็วที่สุด มิฉะนั้นตัวละครอาจถูกสะสมและส่งไปยังหรือจากสภาพแวดล้อมโฮสต์เป็นบล็อก เมื่อสตรีมถูกบัฟเฟอร์อย่างสมบูรณ์อักขระจะถูกส่งไปยังหรือจากสภาพแวดล้อมโฮสต์เป็นบล็อกเมื่อบัฟเฟอร์เต็ม เมื่อสตรีมถูกบัฟเฟอร์บรรทัดตัวอักษรมีวัตถุประสงค์เพื่อส่งไปยังหรือจากสภาพแวดล้อมโฮสต์เป็นบล็อกเมื่อพบอักขระบรรทัดใหม่ นอกจากนี้อักขระมีจุดประสงค์เพื่อส่งเป็นบล็อกไปยังสภาพแวดล้อมโฮสต์เมื่อบัฟเฟอร์เต็มเมื่อมีการร้องขออินพุตในสตรีมที่ไม่บัฟเฟอร์หรือเมื่อมีการร้องขออินพุตในสตรีมบัฟเฟอร์บรรทัดที่ต้องการการส่งอักขระจากสภาพแวดล้อมโฮสต์ .
ซึ่งหมายความว่าstd::cout
และstd::cin
ได้รับการบัฟเฟอร์อย่างสมบูรณ์หากว่าพวกเขากำลังอ้างถึงอุปกรณ์ที่ไม่มีการโต้ตอบ กล่าวอีกนัยหนึ่งถ้า stdout แนบกับเทอร์มินัลก็ไม่มีความแตกต่างในพฤติกรรม
อย่างไรก็ตามหากstd::cout.sync_with_stdio(false)
มีการเรียกใช้'\n'
จะไม่ทำให้เกิดการลบแม้แต่กับอุปกรณ์แบบโต้ตอบ มิฉะนั้น'\n'
จะเทียบเท่ากับstd::endl
เว้นแต่ท่อไปยังไฟล์: C ++ โทษในมาตรฐาน