参考博客:https://www.cnblogs.com/wangshaowei/p/11905831.html
终于找到了一个简单的可以用标准库实现的方法了。
可以随时打开一个内存文件流,然后像fstream那样读写和任意寻址。 不会像 stringstream 那样,只能读取一次,不能回头。 这个可以随时 seekg 到开头重复读,也可以随时 seekp 到任意地方任意写。
额外注意,不能通过直接seekp到 write 以外的地方写入用于扩增容量,会使流进入失败状态。 例如 新开一个内存文件流,写入5个字节,此时如果 seekp 到100字节处,然后再写入任意字节,该流会进入失败状态。这个行为与 fstream 不同,fstream会直接扩增文件大小到105字节以上,而不会。
#include <iostream>
#include <sstream>
using namespace std;
class mem_fstream : virtual public std::istream, virtual public std::ostream
{
public:
inline mem_fstream() :std::istream(&strbuf), std::ostream(&strbuf)
{
}
private:
std::stringbuf strbuf;
};
int main()
{
auto mb = mem_fstream();
char ddd[21] = { 0 };
mb.write("asd\0asd", 8);
int n = mb.read(ddd, 8).gcount();
cout << n << endl;
mb.seekg(0, ios::beg);
n = mb.read(ddd, 8).gcount();
cout << n << endl;
mb.seekp(0, ios::beg);
mb.write("ddddd", 5);
mb.seekg(0, ios::beg);
n = mb.read(ddd, 5).gcount();
cout << n << endl;
cout << mb.tellg() << endl;
cout << ddd << endl;
mb.seekg(0, ios::end);
cout << mb.tellg() << endl;
char* empty_data = new char[100];
mb.write(empty_data, 100);
mb.seekg(0, ios::end);
cout << mb.tellg() << endl;
return 0;
}
输出
8
8
5
5
dddddsd
8
105
|