c ++使用内存中的ifstream

时间:2012-11-27 13:10:38

标签: c++ ifstream memcpy

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

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

如果没有有效阅读文件,如何将char *数据放入ifstream

5 个答案:

答案 0 :(得分:8)

标准库提供了一个也可写的内存istreamstd::stringstream

您需要正确抽象代码,使其接受通用istream而不是ifstream,构造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

答案 1 :(得分:7)

如果可以稍微更改使用ifstream&的代码以使用istream&,那么您可以轻松地在ifstreamistringstream之间切换(用于从内存中读取数据) :

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

呼叫者:

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

std::ifstream in_file("file.txt");
read_data(in_file);

答案 2 :(得分:7)

虽然使用了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);

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

答案 3 :(得分:1)

您可能正在搜索字符串流。 http://www.cplusplus.com/reference/sstream/stringstream/。我之前只使用过一次并且已经很长时间了,但基本上你可以从内存中的位置流式传输。

答案 4 :(得分:0)

在我的项目中,我使用iostream的write()和read()方法,因为我将二进制数据写入字符串流。抱歉,以下代码未经过测试,可能存在语法错误(从办公室输入... ;-),但这样的内容允许您写入内存,文件和其他地方(例如网络套接字):

void foo(std::iostream *mystream)
{
    mystream.write("Hello", 5);
    uint32_t i=5302523;
    mystream.write((char*) &i, sizeof i);
}

int main()
{
    // Write to memory. stringstream's write() and read() work binary
    std::stringstream memstream;
    foo(&memstream);

    // Write to file
    std::fstream f;
    try
    {
        f.open("file.dat");
        foo(&f);
    }
    catch (...)
    {
        // ...
    }

    if (f.is_open())
        f.close();

    return EXIT_SUCCESS;
}