C++ 虚拟 "file"流

标签 c++

我有一个将二进制数据写入文件的对象。有时它需要寻找开始并重新写入一些数据,以更新实例的头部。我现在需要避免文件 i/o,所以我正在寻找相当于我可以寻找的“虚拟”文件流的东西。
现在我正在使用 vector ,但我首先从文件切换到尽可能地提高性能。我在尝试模仿时也遇到了逻辑问题 fseek与 vector 。
有没有更好的对象可以在 C++ 中使用?我的用例是

MyVirtualStream vs;
vs.Write(somebytes);
vs.Write(somebytes);
vs.Seek(0);
vs.Read(&somestruct);
somestruct.data = 555;
vs.Write(struct);
vs.Seek(0 + sizeof(somestruct));

最佳答案

您可以使用 std::stringstream :
注意:读写位置seekgseekp独立 std:stringstream ,但是是 可互换 用于文件流。换句话说,只为文件维护一个指针。

#include <sstream>
#include <iostream>

struct Header
{
    int flag1;
    char flag2;
};

// Also you can provide an overload for `std::ostream::operator<<` like

std::ostream& operator<<(std::ostream& out, Header& h)
{
    out.write(reinterpret_cast<char*>(&h), sizeof(Header));
    return out;
}

std::istream& operator>>(std::istream& in, Header& h)
{
    Header header;
    in.read( reinterpret_cast<char*>(&header), sizeof(Header) );
    h = std::move(header);
    return in;
}


int main(int argc, char *argv[])
{

    std::stringstream ss;
    Header h {0x30303030, 0x31};
    Header h2 {0x32323232, 0x33};
    std::string str = "Hello, world";
    ss << str;
    ss.seekp(0);  // move write position.
    ss.write("Buy  ", 5);
    std::cout << ss.str() << std::endl;
    ss.write(reinterpret_cast<char*>(&h), sizeof(Header));
    ss.seekg(5); // move read position
    ss.read(reinterpret_cast<char*>(&h2), sizeof(Header));
    return 0;
}

关于C++ 虚拟 "file"流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63055565/

相关文章:

c++ - 重载运算符+两次(类内和类外)

c++ - 有没有更好的方法来排列字符串?

c++ - 明确删除赋值运算符时允许从右值赋值?

POSIX 上的 C++ 故障转储

java - C++11、C#和Java内存模型的区别

c++ - 如何使编辑控件和丰富控件中的文本无法选择?

c++ - ->、->* 和 .* 运算符的正确术语是什么?

c++ - OpenGL 中的纹理渲染非常奇怪

android - 在 C4droid 中包含新的头文件

c++ - Eigen :设置 EIGEN_STACK_ALLOCATION_LIMIT 不起作用