Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ use ifstream from memory

I have some code that uses ifstream to read some data from a file and everything works.

Now I wish, without modifying some code, read this data from a memory, actually I have a char * that contains the data...

How can I put my char * data into a ifstream without reading effectively the file?

like image 754
ghiboz Avatar asked Nov 27 '12 13:11

ghiboz


2 Answers

Although use of std::istringstream (sometimes erronously referred to without the leading i; such a class does exist but is more expensive to construct, as it also sets up an output stream) is very popular, I think it is worth pointing out that this makes—at a minimum—one copy of the actual string (I'd suspect that most implementations create two copies even). Creating any copy can be avoided using a trivial stream buffer:

struct membuf: std::streambuf {
    membuf(char* base, std::ptrdiff_t n) {
        this->setg(base, base, base + n);
    }
};
membuf sbuf(base, n);
std::istream in(&sbuf);

For a small area of memory, the difference may not matter, although the saved allocation can be noticable there, too. For large chunks of memory, it makes a major difference.

like image 184
Dietmar Kühl Avatar answered Oct 26 '22 17:10

Dietmar Kühl


If the code that uses the ifstream& could be changed slightly to use an istream& then you could easily switch between ifstream and istringstream (for reading data from memory):

void read_data(std::istream& in)
{
}

Callers:

std::istringstream in_stream(std::string("hello"));
read_data(in_stream);

std::ifstream in_file("file.txt");
read_data(in_file);
like image 33
hmjd Avatar answered Oct 26 '22 16:10

hmjd