如何在C ++中用stringstream替换一些字符?

时间:2014-06-11 11:08:30

标签: c++ visual-c++ stringstream

我需要在VC ++项目中替换字符串流中的所有回车符/换行符。我对此非常陌生,我尝试了以下方法:

strCustData.Replace("\r\n","")

但是这不起作用,因为strCustData是stringstream类型,而不是string。请帮助我实现这一目标。

3 个答案:

答案 0 :(得分:3)

您可能希望使用流缓冲区来过滤掉字符:

class filter : public std::streambuf
{
public:
    filter(std::ostream& os) : m_sbuf(os.rdbuf()) { }

    int_type overflow(int_type c) override
    {
        return m_sbuf->sputc(c == '\r' ? traits_type::eof() : c);
    }

    int sync() override { return m_sbuf->pubsync() ? 0 : -1; }
private:
    std::streambuf* m_sbuf;
};

现在您可以像这样使用它:

filter f(strCustData);
std::ostream os(&f);

os <<"\r\n"; // '\n'

答案 1 :(得分:2)

一个丑陋的(因为使用std::string作为缓冲区而重复的内存)方法是这样的:

// replace "foo" with "bar"
std::stringstream myStringStream("foobarfoobar");
std::string myString(myStringStream.str());

size_t start = 0;
while ((start = myString.find("foo", start)) != std::string::npos) {
    myString.replace(start, strlen("foo"), "bar");
}
myStringStream.str(myString);

答案 2 :(得分:1)

您需要将stringstream转换为std::string - 而不是像您似乎尝试过的CString一样。 std::string有许多可用于操纵角色的函数。

像这样(未经测试):

std::istringstream stream;
std::string str(stream.str());
std::replace(str.begin(), str.end(), '\r', ' '); 
std::replace(str.begin(), str.end(), '\n', ' '); 

你可能可以将两个替换合并为一个,但我正在写下我的头脑。