我有一个将二进制数据写入文件的对象。有时它需要寻找开始并重新写入一些数据,以更新实例的头部。我现在需要避免文件 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
:
注意:读写位置seekg
和 seekp
是 独立 为 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/