stack user
stack user

Reputation: 863

can I std::find a string in a stringstream?

I have a stringstream that I'd like to iterate and determine if a substring exists in it.

I know that I could just convert to a string and do std::string::find(), but I was just hoping to avoid the conversion from stringstream to string if possible.

I understand the following won't work because the istream_iterator uses char as its type (not string)

stringstream ssBody;
string sFindThis;

...

auto itr = std::find (
    istreambuf_iterator<char>(ssBody),
    istreambuf_iterator<char>(),
    sFindThis
);

But can I somehow search for a string in stringstream with std::find or similar without a conversion to string?

Upvotes: 7

Views: 10627

Answers (2)

rahnema1
rahnema1

Reputation: 15837

using pubsetbuf it is possible to associate a buffer with basic_stringbuf member and then search the buffer, however behavior of this function is implementation defined. explanations and the example are from http://en.cppreference.com/w/cpp/io/basic_stringbuf/setbuf

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream ss;
    char c[1024] = {};
    ss.rdbuf()->pubsetbuf(c, 1024);
    ss << 3.14 << '\n';
    std::cout << c << '\n';
}

Upvotes: 3

Sam Varshavchik
Sam Varshavchik

Reputation: 118340

The C++ standard does not define any std::[io]?stringstream methods for searching its contents.

Neither can you use std::istreambuf_iterator together with std::search(), since std::istreambuf_iterator is an input iterator, but std::search() requires a forward iterator.

The only effective way to search a string stream is to convert it to a std::string, first.

Upvotes: 7

Related Questions