2011-11-14 35 views
55

Tôi đang cố gắng tìm hiểu thêm một chút về cách luồng I/O hoạt động trong C++, và tôi thực sự bối rối khi sử dụng cái gì.Chính xác thì streambuf là gì? Làm thế nào để tôi sử dụng nó?

Chính xác là streambuf là gì?
Khi nào tôi sử dụng streambuf, so với string, một số istream hoặc vector? (Tôi đã biết ba cuối cùng, nhưng không phải là cách streambuf so sánh với họ, nếu nó làm gì cả.)

+0

Đó là sự trừu tượng không tốt của bộ đệm luồng. – Pubby

+1

@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

+0

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

Trả lời

38

đệ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<<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ư numpunctnum_get. Bạn cũng có thể mong đợi rằng sự quá tải của luồng operator<<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.

+3

Đây là 5 năm quá muộn, vì vậy tôi sẽ không đăng nó như là một câu trả lời và không chấp nhận điều này, nhưng đối với bất cứ ai vẫn còn bối rối bởi các thuật ngữ ngay cả sau khi đọc này: 'streambuf' là cho ** raw ** dữ liệu (ví dụ: byte thô, int thô, v.v.), trong khi 'luồng' là dữ liệu ** đã nấu ** (văn bản, số nguyên được định dạng dưới dạng văn bản, v.v.). Đặt một cách khác, 'dòng' đại diện cho lớp ** phân tích ** (hoặc tuần tự hóa). Khi xử lý các chuỗi đơn giản, bạn có thể sử dụng về mặt kỹ thuật, nhưng ý nghĩa là khác nhau: 'streambuf' có nghĩa là bạn muốn dữ liệu thô là chính chuỗi, trong khi' stream' tóm tắt mã hóa. – Mehrdad

46

Với sự giúp đỡ của streambuf, chúng ta có thể làm việc trong một thậm chí thấp hơn mức. Nó cho phép truy cập vào các bộ đệm cơ bản.

Dưới đây là một số ví dụ tốt: Copy, load, redirect and tee using C++ streambufs và trong tài liệu tham khảo để so sánh, Điều này có thể hữu ích,

enter image description here

Xem này để biết thêm chi tiết: IOstream Library

+3

+1 để trỏ đến một bài viết tuyệt vời. – jweyrich

+1

Tôi đã tìm kiếm tất cả những thứ có thể giải thích về streambuf cũng như bài viết này. Cảm ơn vì đã giúp tôi tìm! – wvdschel

Các vấn đề liên quan