Search code examples
c++istream

Get an istream from a char*


I have a char* and the data length that I'm receiving from a library, and I need to pass the data to a function that takes an istream.

I know I can create a stringstream but that will copy all the data. And also, the data will surely have 0s since it's a zip file, and creating a stringstream will take the data until the first 0 I think.

Is there any way to create an istream from a char* and it's size without copying all the data?


Solution

  • Here's a non-deprecated method found on the web, has you derive your own std::streambuf class, but easy and seems to work:

    #include <iostream>
    #include <istream>
    #include <streambuf>
    #include <string>
    
    struct membuf : std::streambuf
    {
        membuf(char* begin, char* end) {
            this->setg(begin, begin, end);
        }
    };
    
    int main()
    {
        char buffer[] = "I'm a buffer with embedded nulls\0and line\n feeds";
    
        membuf sbuf(buffer, buffer + sizeof(buffer));
        std::istream in(&sbuf);
        std::string line;
        while (std::getline(in, line)) {
            std::cout << "line: " << line << "\n";
        }
        return 0;
    }
    

    Which outputs:

    line: I'm a buffer with embedded nullsand line
    line:  feeds