đệm Suối đại diện cho các thiết bị đầu vào hoặc đầu ra và cung cấp giao diện cấp thấp cho I/O chưa được định dạng cho thiết bị đó. Mặt khác, luồng cung cấp trình bao bọc cấp cao hơn xung quanh bộ đệm bằng các hàm I/O cơ bản chưa được định dạng và đặc biệt là thông qua các hàm I/O được định dạng (tức là, operator<<
và operator>>
quá tải). Các đối tượng luồng cũng có thể quản lý tuổi thọ của bộ đệm luồng.
Ví dụ: luồng tệp có bộ đệm luồng tệp nội bộ. Luồng quản lý tuổi thọ của bộ đệm và bộ đệm là những gì cung cấp khả năng đọc và ghi thực tế cho một tệp. Các toán tử định dạng của luồng cuối cùng truy cập các hàm I/O không định dạng của bộ đệm, vì vậy bạn chỉ phải sử dụng các hàm I/O của luồng và không cần chạm trực tiếp vào các hàm I/O của bộ đệm.
Một cách khác để hiểu sự khác biệt là xem xét các cách sử dụng khác nhau mà chúng tạo ra từ các đối tượng địa phương. Các luồng sử dụng các khía cạnh có liên quan đến định dạng như numpunct
và num_get
. Bạn cũng có thể mong đợi rằng sự quá tải của luồng operator<<
và operator>>
cho các loại dữ liệu thời gian hoặc tiền tùy chỉnh sẽ sử dụng các khía cạnh định dạng thời gian và tiền bạc. Tuy nhiên, bộ đệm luồng sử dụng các khía cạnh codecvt để chuyển đổi giữa các đơn vị mà giao diện của chúng sử dụng và byte. Vì vậy, ví dụ, giao diện cho basic_streambuf<char16_t>
sử dụng char16_t
và do đó basic_streambuf<char16_t>
sử dụng nội bộ codecvt<char16_t, char, mbstate_t>
theo mặc định để chuyển đổi các đơn vị char16_t
được định dạng được ghi vào bộ đệm thành char
đơn vị được ghi vào thiết bị cơ bản. Vì vậy, bạn có thể thấy rằng luồng chủ yếu để định dạng và bộ đệm luồng cung cấp giao diện cấp thấp cho đầu vào hoặc đầu ra chưa được định dạng cho các thiết bị có thể sử dụng mã hóa bên ngoài khác.
Bạn có thể sử dụng bộ đệm luồng khi bạn chỉ muốn truy cập chưa được định dạng vào thiết bị I/O. Bạn cũng có thể sử dụng bộ đệm luồng nếu bạn muốn thiết lập nhiều luồng chia sẻ bộ đệm luồng (mặc dù bạn sẽ phải quản lý cẩn thận tuổi thọ của bộ đệm). Ngoài ra còn có các bộ đệm luồng mục đích đặc biệt mà bạn có thể muốn sử dụng, chẳng hạn như wbuffer_convert
trong C++ 11 hoạt động như mặt tiền cho một basic_streambuf<char>
để làm cho nó trông giống như bộ đệm luồng ký tự rộng. Nó sử dụng khía cạnh codecvt nó được xây dựng với thay vì sử dụng khía cạnh codecvt gắn liền với bất kỳ ngôn ngữ nào. Bạn thường có thể đạt được hiệu ứng tương tự bằng cách sử dụng bộ đệm luồng rộng được thấm nhuần với một ngôn ngữ có khía cạnh thích hợp.
Đó là sự trừu tượng không tốt của bộ đệm luồng. – Pubby
@Pubby: Er, "bộ đệm luồng" là gì? Làm thế nào là nó khác với một dòng hoặc một bộ đệm? – Mehrdad
Từ những gì tôi hiểu, một luồng định dạng đầu vào/ra và lưu trữ nó trong bộ đệm của nó. – Pubby