2010-06-06 41 views
10

Xin chào! Vấn đề của tôi có thể được mô tả theo cách sau:C++ - Triển khai luồng của riêng tôi

Tôi có một số dữ liệu mà thực sự là một mảng và có thể được biểu diễn như char* data với một số size

Tôi cũng có một số mã di sản (chức năng) mà phải mất một số đối tượng std::istream trừu tượng làm tham số và sử dụng luồng đó để truy xuất dữ liệu để hoạt động.

Vì vậy, câu hỏi của tôi là như sau - điều gì sẽ là cách dễ dàng để ánh xạ data của tôi tới một số đối tượng std::istream để tôi có thể chuyển nó đến chức năng của mình? Tôi nghĩ về việc tạo ra một đối tượng std::stringstream từ data của tôi, nhưng điều đó có nghĩa là sao chép và (như tôi giả định) không phải là giải pháp tốt nhất.

Bất kỳ ý tưởng nào về cách này có thể được thực hiện để std::istream hoạt động trực tiếp trên data?

Cảm ơn bạn.

Trả lời

10

Nếu bạn đang thực sự tạo luồng của riêng mình, tôi sẽ xem thư viện Boost.Iostreams. Nó giúp dễ dàng tạo các đối tượng luồng của riêng bạn.

+0

Và, IIRC, đã có keo cho kéo thứ ra khỏi một std :: vector hoặc một mảng. – Thanatos

2

Sử dụng chuỗi dòng:

#include <sstream> 

int main() 
{ 
    char[] data = "PLOP PLOP PLOP"; 
    int  size = 13; // PS I know this is not the same as strlen(data); 

    std::stringstream stream(std::string(data, size)); 

    // use stream as an istream; 
} 

Nếu bạn muốn trở thành effecient thực bạn có thể muck với bộ đệm dòng trực tiếp. Tôi đã không cố gắng này và không có một trình biên dịch để kiểm tra với, nhưng folowing nên làm việc:

#include <sstream> 

int main() 
{ 
    char[] data = "PLOP PLOP PLOP"; 
    int  size = 13; // PS I know this is not the same as strlen(data); 

    std::stringstream stream; 
    stream.rdbuf()->pubsetbuf(data, size); 

    // use stream as an istream; 
} 
5

Chắc chắn không phải là cách dễ dàng nhất nhưng chỉ trong trường hợp ai đó muốn tìm hiểu cách suối std làm việc bên trong, điều này dường như được giới thiệu rất tốt đẹp về làm thế nào bạn có thể cuộn của riêng bạn:

http://www.mr-edd.co.uk/blog/beginners_guide_streambuf

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