Tôi nhớ lại việc đọc về điều này trong tiêu chuẩn, vì vậy ở đây đi:
Xem tiêu chuẩn C11 xác định cách thức hoạt động của các luồng tiêu chuẩn, vì các chương trình C ++ giao tiếp với CRT, tiêu chuẩn C11 sẽ chi phối chính sách xả tại đây.
ISO / IEC 9899: 201x
7.21.3 §7
Khi khởi động chương trình, ba luồng văn bản được xác định trước và không cần phải mở một cách rõ ràng - đầu vào tiêu chuẩn (để đọc đầu vào thông thường), đầu ra tiêu chuẩn (để viết đầu ra thông thường) và lỗi tiêu chuẩn (để ghi đầu ra chẩn đoán). Khi mở lần đầu, luồng lỗi tiêu chuẩn không được đệm hoàn toàn; các luồng đầu vào tiêu chuẩn và đầu ra tiêu chuẩn được đệm hoàn toàn khi và chỉ khi luồng có thể được xác định không tham chiếu đến một thiết bị tương tác.
7.21.3 §3
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ủ .
Điều này có nghĩa là std::cout
và std::cin
được đệm hoàn toàn khi và chỉ khi chúng đề cập đến một thiết bị không tương tác. Nói cách khác, nếu thiết bị xuất chuẩn được gắn vào một thiết bị đầu cuối thì không có sự khác biệt trong hành vi.
Tuy nhiên, nếu std::cout.sync_with_stdio(false)
được gọi, thì '\n'
sẽ không gây ra ngay cả các thiết bị tương tác. Mặt khác '\n'
là tương đương với std::endl
trừ khi đường ống đến tập tin: c ++ ref trên std :: endl .