2012-12-15 47 views
14

Tôi đã thực hiện hai triển khai lớp này và phát hiện ra rằng lớp strstream không còn được dùng nữa.Sự khác biệt giữa strstream và stringstream

Và nếu tôi sử dụng lớp stringstream để thay thế, thì có sự khác biệt lớn giữa cách họ đăng nhập vào bộ đệm vì đối tượng lớp stringstream duy trì bản sao sâu của bộ đệm.

Có ai gặp phải bất kỳ sự cố nào trong khi thay thế strstream bằng lớp học stringstream không?

Điều gì sẽ là đầu ra của mã này và tại sao?

#include<iostream> 
#include <sstream> 
#include <strstream> 



int main(){ 

    char strArr[] = "Soheb Khan is great"; 

    char stringArr[] = "TurboCharging"; 

    std::strstream strStream(strArr,19); 

    std::stringstream stringStream(std::string(stringArr,19)); 

    std::cout<<"Before Modification strArr= "<<strArr<<" & stringArr= "<<stringArr<<std::endl; 

    strStream << "Fifa 2012 is nice"; 


    stringStream << "Sometimes its sucks"; 


    std::cout<<"After Modification strArr= "<<strArr<<" & stringArr= "<<stringArr<<std::endl; 

    return 0; 


} 

Trả lời

8

Các lớp học từ <strstream> rất khó sử dụng. Khi chúng trở nên phổ biến hơn, tôi đã không thấy bất kỳ sản phẩm chính xác nào được sử dụng (tốt, chúng đã được sửa khi tôi phát hiện ra các vấn đề). Mọi người không chấm dứt chuỗi bằng cách sử dụng std::ends hoặc họ không giải phóng bộ nhớ bằng cách sử dụng s.freeze(0) (hoặc, thường xuyên nhất, cả hai). Mặc dù lớp <sstream> tạo một bản sao nhưng tôi không thấy đây là vấn đề. Trong trường hợp phân bổ bộ nhớ thực sự quan trọng đối với trường hợp sử dụng của bạn, vì bạn cần phân bổ các khối lớn hoặc vì bạn có nhiều phần, bạn có thể kiểm soát dễ dàng và có dữ liệu đọc hoặc ghi vào bộ đệm mà bạn cung cấp bằng cách sử dụng tùy chỉnh bộ đệm luồng. Ví dụ: bộ đệm luồng ghi vào một đoạn bộ nhớ dễ phân bổ là không đáng kể để viết:

struct omembuf 
    : std::streambuf { 
{ 
    omembuf(char* base, std::size_t size) { 
     this->setp(base, base + size); 
    } 
    char* begin() const { return this->pbase(); } 
    char* end() const { return this->pptr(); } 
}; 
Các vấn đề liên quan