strstream和stringstream之间的区别

时间:2012-12-15 14:42:17

标签: c++ c++11

我正在浏览这两个类实现,发现strstream类已被弃用。

如果我使用stringstream类作为替换,那么他们登录缓冲区的方式就有很大差异,因为stringstream类对象维护缓冲区的深层副本。

在用strstream类替换stringstream时,是否有人遇到任何问题?

此代码的输出是什么以及为什么?

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


}

1 个答案:

答案 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(); }
};