ไม่มันไม่ใช่พฤติกรรมของ POSIX แต่เป็นพฤติกรรมของ ISO (แต่ก็เป็นพฤติกรรมของ POSIX แต่จะทำได้เพียงตราบเท่าที่สอดคล้องกับ ISO)
เอาต์พุตมาตรฐานเป็นบัฟเฟอร์บรรทัดหากตรวจพบการอ้างถึงอุปกรณ์แบบอินเทอร์มินัลมิฉะนั้นจะถูกบัฟเฟอร์เต็ม ดังนั้นจึงมีสถานการณ์ที่printf
ไม่ล้างข้อมูลแม้ว่าจะได้รับบรรทัดใหม่ในการส่งออกเช่น:
myprog >myfile.txt
สิ่งนี้เหมาะสมสำหรับประสิทธิภาพเนื่องจากถ้าคุณโต้ตอบกับผู้ใช้พวกเขาอาจต้องการเห็นทุกบรรทัด หากคุณกำลังส่งเอาต์พุตไปยังไฟล์เป็นไปได้มากว่าไม่มีผู้ใช้ที่ปลายอีกด้านหนึ่ง (แม้ว่าจะเป็นไปไม่ได้ก็ตาม ตอนนี้คุณสามารถยืนยันได้ว่าผู้ใช้ต้องการเห็นตัวละครทุกตัว แต่มีปัญหาสองประการ
อย่างแรกคือมันไม่ได้มีประสิทธิภาพมาก อย่างที่สองก็คือเอกสารต้นฉบับของ ANSI C คือการประมวลผลพฤติกรรมที่มีอยู่เป็นหลักมากกว่าที่จะคิดค้นพฤติกรรมใหม่และการตัดสินใจออกแบบเหล่านั้นได้ทำมานานก่อนที่ ANSI จะเริ่มกระบวนการ แม้แต่ทุกวันนี้ ISO ก็ยังดำเนินการอย่างระมัดระวังเมื่อเปลี่ยนกฎที่มีอยู่ในมาตรฐาน
สำหรับวิธีจัดการกับสิ่งนั้นหากคุณfflush (stdout)
หลังจากทุกการเรียกเอาต์พุตที่คุณต้องการดูทันทีจะช่วยแก้ปัญหาได้
หรือคุณสามารถใช้setvbuf
ก่อนที่จะเปิดใช้งานstdout
เพื่อตั้งเป็น unbuffered และคุณไม่ต้องกังวลเกี่ยวกับการเพิ่มfflush
บรรทัดเหล่านั้นทั้งหมดในรหัสของคุณ:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
เพียงจำไว้ว่าอาจส่งผลกระทบต่อประสิทธิภาพการทำงานเล็กน้อยหากคุณกำลังส่งออกไปยังไฟล์ โปรดทราบว่าการสนับสนุนสำหรับสิ่งนี้คือการใช้งานที่กำหนดไม่ได้รับการรับรองตามมาตรฐาน
ส่วน ISO C99 7.19.3/3
เป็นบิตที่เกี่ยวข้อง:
เมื่อกระแสเป็นunbufferedตัวละครมีความตั้งใจที่จะปรากฏจากแหล่งที่มาหรือที่ปลายทางเร็วที่สุดเท่าที่เป็นไปได้ มิฉะนั้นตัวละครอาจถูกสะสมและส่งไปยังหรือจากสภาพแวดล้อมโฮสต์เป็นบล็อก
เมื่อสตรีมถูกบัฟเฟอร์อย่างสมบูรณ์อักขระจะถูกส่งไปยังหรือจากสภาพแวดล้อมโฮสต์เป็นบล็อกเมื่อบัฟเฟอร์เต็ม
เมื่อสตรีมถูกบัฟเฟอร์บรรทัดตัวอักษรมีวัตถุประสงค์เพื่อส่งไปยังหรือจากสภาพแวดล้อมโฮสต์เป็นบล็อกเมื่อพบอักขระบรรทัดใหม่
นอกจากนี้อักขระมีจุดประสงค์เพื่อส่งเป็นบล็อกไปยังสภาพแวดล้อมโฮสต์เมื่อบัฟเฟอร์เต็มเมื่อมีการร้องขออินพุตในสตรีมที่ไม่บัฟเฟอร์หรือเมื่อมีการร้องขออินพุตในสตรีมบัฟเฟอร์บรรทัดที่ต้องการการส่งอักขระจากสภาพแวดล้อมโฮสต์ .
การสนับสนุนสำหรับคุณสมบัติเหล่านี้คือการกำหนดการใช้งานและอาจได้รับผลกระทบผ่านทางsetbuf
และsetvbuf
ฟังก์ชั่น