Как заменить некоторые символы из stringstream в C++?

У меня есть требование заменить все возвраты каретки/переводы строк из строкового потока в проекте VC++. Я очень новичок в этом, и я пробовал следующее:

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

Но это не работает, потому что strCustData имеет тип stringstream, а не string. Пожалуйста, помогите мне в достижении этого.


person satyanarayana    schedule 11.06.2014    source источник


Ответы (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'
person 0x499602D2    schedule 11.06.2014

Уродливый (дублирование памяти из-за использования 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);
person Iosif Murariu    schedule 11.06.2014

Вам нужно преобразовать 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', ' '); 

Вы, вероятно, могли бы объединить две замены в одну, но я пишу с головы до ног.

person graham.reeds    schedule 11.06.2014
comment
Спасибо за ответ. Но мне нужен вывод в stringstream, а не std::string. Есть ли способ конвертировать обратно в stringstream после замены? - person satyanarayana; 11.06.2014
comment
Если вы хотите оставаться в потоках, вы можете передавать данные из одного потока в другой и манипулировать каждым символом, когда они проходят через (get или read). Если вы не записываете на диск, вам придется в какой-то момент покинуть пределы stringstream. - person graham.reeds; 11.06.2014