Không, đó không phải là hành vi POSIX, đó là hành vi ISO (tốt, đó là hành vi POSIX nhưng chỉ trong chừng mực khi chúng tuân thủ ISO).
Đầu ra tiêu chuẩn được đệm dòng nếu có thể được phát hiện để chỉ một thiết bị tương tác, nếu không, nó được đệm hoàn toàn. Vì vậy, có những tình huống printf
sẽ không tuôn ra, ngay cả khi nó nhận được một dòng mới để gửi đi, chẳng hạn như:
myprog >myfile.txt
Điều này có ý nghĩa về hiệu quả vì nếu bạn tương tác với người dùng, họ có thể muốn xem mọi dòng. Nếu bạn đang gửi đầu ra tới một tệp, rất có thể không có người dùng ở đầu kia (mặc dù không phải là không thể, họ có thể theo đuôi tệp). Bây giờ bạn có thể lập luận rằng người dùng muốn nhìn thấy mọi nhân vật nhưng có hai vấn đề với điều đó.
Đầu tiên là nó không hiệu quả lắm. Thứ hai là nhiệm vụ ANSI C ban đầu chủ yếu là mã hóa hành vi hiện có , thay vì phát minh ra hành vi mới và những quyết định thiết kế đó đã được đưa ra từ lâu trước khi ANSI bắt đầu quá trình. Ngay cả ISO ngày nay cũng rất cẩn thận khi thay đổi các quy tắc hiện có trong các tiêu chuẩn.
Về cách giải quyết vấn đề đó, nếu bạn fflush (stdout)
sau mỗi cuộc gọi đầu ra mà bạn muốn xem ngay lập tức, điều đó sẽ giải quyết vấn đề.
Ngoài ra, bạn có thể sử dụng setvbuf
trước khi vận hành stdout
, để đặt nó thành không có bộ đệm và bạn sẽ không phải lo lắng về việc thêm tất cả các fflush
dòng đó vào mã của mình:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Chỉ cần lưu ý rằng có thể ảnh hưởng đến hiệu suất khá nhiều nếu bạn đang gửi đầu ra đến một tệp. Ngoài ra, hãy nhớ rằng hỗ trợ cho việc này được xác định theo triển khai, không được đảm bảo bởi tiêu chuẩn.
Phần ISO C99 7.19.3/3
là bit có liên quan:
Khi một luồng không có bộ đệm , các ký tự được dự định xuất hiện từ nguồn hoặc tại đích càng sớm càng tốt. Mặt khác, các ký tự có thể được tích lũy và truyền đến hoặc từ môi trường máy chủ dưới dạng một khối.
Khi một luồng được đệm hoàn toàn , các ký tự được dự định được truyền đến hoặc từ môi trường máy chủ dưới dạng một khối khi bộ đệm được lấp đầy.
Khi một luồng được đệm dòng , các ký tự được dự định được truyền đến hoặc từ môi trường máy chủ dưới dạng một khối khi gặp phải một ký tự dòng mới.
Hơn nữa, các ký tự được dự định được truyền dưới dạng một khối đến môi trường máy chủ khi bộ đệm được lấp đầy, khi đầu vào được yêu cầu trên luồng không có bộ đệm hoặc khi đầu vào được yêu cầu trên luồng được đệm yêu cầu truyền các ký tự từ môi trường máy chủ .
Hỗ trợ cho các đặc điểm này được xác định theo triển khai và có thể bị ảnh hưởng thông qua các chức năng setbuf
và setvbuf
.