Как да замените някои символи от 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