2012-12-15 35 views
14

私はこれらの2つのクラスの実装を行っていて、strstreamクラスが非推奨であることを発見しました。strstreamとstringstreamの違い

stringstreamクラスを置き換えた場合、stringstreamクラスオブジェクトはバッファのディープコピーを保持しているため、バッファにログインする方法には大きな違いがあります。

strstreamstringstreamクラスに置き換えている人はいますか?

このコードの出力とは何でしょうか?

#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; 


} 

答えて

8

<strstream>からのクラスは、使用には驚くほどです。彼らがもっと人気を博したとき、私は正しいプロダクションが使われているのを見たことがありませんでした(問題を見つけたときに修正されました)。人々はstd::endsを使用して文字列を終了しなかったか、s.freeze(0)(または、多くの場合、両方)を使用してメモリを解放しませんでした。 <sstream>クラスはコピーを作成しますが、これは問題ではありませんでした。

大容量のチャンクを割り当てる必要がある場合や、多数のチャンクを割り当てる必要があるため、メモリ割り当てが実際に問題になる場合は、簡単に制御でき、カスタムを使用してバッファにデータを読み書きすることができますストリームバッファ。例えば、メモリのチャンクを容易に割り当てるために書き込むストリームバッファは、書き込むのが簡単です。

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(); } 
}; 
関連する問題