c ++使用内存中的ifstream

ghi*_*boz 7 c++ ifstream memcpy

我有一些代码用于ifstream从文件中读取一些数据,一切正常.

现在我希望,不修改一些代码,从内存中读取这些数据,实际上我有一个char *包含数据...

如何char *ifstream没有有效阅读文件的情况下将数据放入?

Die*_*ühl 10

尽管使用std::istringstream(有时候也是错误地引用了领导者i;这样的类也存在,但是构造成本更高,因为它也设置了输出流)非常受欢迎,我认为值得指出这样做,至少,实际字符串的一个副本(我怀疑大多数实现甚至创建了两个副本).使用普通的流缓冲区可以避免创建任何副本:

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);
Run Code Online (Sandbox Code Playgroud)

对于小范围的内存,差异可能无关紧要,尽管保存的分配也可以在那里显着.对于大块内存,它会产生很大的不同.


Jon*_*Jon 8

标准库提供了一个istream可写入的内存:std::stringstream.

您需要正确地抽象代码,使其接受泛型istream而不是ifstream构造a stringstream,用数据填充它并将其传递给函数.

例如:

const char* data = "Hello world";
std::stringstream str((std::string(data))); // all the parens are needed,
                                            // google "most vexing parse"

do_something_with_istream(str); // pass stream to your code
Run Code Online (Sandbox Code Playgroud)


hmj*_*mjd 8

如果使用该代码的代码ifstream&可以略微更改以使用a,istream&则可以轻松切换ifstreamistringstream(用于从内存中读取数据):

void read_data(std::istream& in)
{
}
Run Code Online (Sandbox Code Playgroud)

来电者:

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

std::ifstream in_file("file.txt");
read_data(in_file);
Run Code Online (Sandbox Code Playgroud)