Tôi chỉ tò mò về điều kiện nào cần được thỏa mãn để tự động xóa bộ đệm stdout.Các quy tắc của bộ đệm stdout xả tự động trong C là gì?
Trước hết tôi đã nhầm lẫn rằng mã giả này không in ra mỗi lần lặp:
while (1) {
printf("Any text");
sleep(1);
}
Nhưng nếu tôi thêm ký tự xuống dòng nó sẽ.
Sau vài thí nghiệm tôi thấy rằng trên stdout máy tính của tôi đệm là đỏ ửng:
- Khi tôi đưa vào stdout 1025 ký tự trở lên;
- Khi tôi đọc stdin;
- Khi tôi đặt ký tự dòng mới vào giá trị xuất chuẩn;
Điều kiện đầu tiên là hoàn toàn rõ ràng - khi bộ đệm đầy, nó phải được xả. Cái thứ hai cũng hợp lý. Nhưng tại sao ký tự dòng mới gây ra đỏ bừng? Những điều kiện tiềm ẩn khác cho điều này là gì?
Gần đây tôi đã được thông báo (bởi @chux) rằng điều kiện thứ ba không có trong tiêu chuẩn C, nhưng được thực hiện được xác định, như là hai đầu tiên. –
Bạn có thể xem [http://stackoverflow.com/questions/13932932/why-does-stdout-need-explicit-flushing-when-redirected-to-file#13933741](http://stackoverflow.com/questions/13932932/why-does-stdout-need-clear-flushing-khi-chuyển hướng-to-file # 13933741) – owacoder
@WeatherVane: Tôi nghĩ rằng bạn hiểu lầm. Hành vi * được yêu cầu * bởi C đối với các luồng đầu ra có dòng đệm, nhưng stdout không cần phải được xếp hàng đệm trừ khi nó là một thiết bị tương tác. –