我需要修改现有功能,即根据系统配置创建文件。事先不知道创建的文件的总大小。因此,原始函数只是创建一个文件并将所有内容转储到其中。它甚至在内存中保留一些偏移量并在此过程中更新文件。
我不允许在磁盘上创建文件。我需要将所有内容保存在一个变量中。但是,我事先并不知道总的大小。
您能为我建议一个这种情况的数据结构吗?
答案 0 :(得分:1)
只是为了纠正@Raxvan的回答。您可以将二进制文件写入std :: stringstream。例如,如果要读取和写入字符串流,请将其声明为:
std::stringstream buffer(std::iostream::in | std::iostream::out | std::iostream::binary);
如果要将二进制数据写入其中:
int integer = 1234;
buffer.write(reinterpret_cast<char*>(&integer), sizeof(int));
如果您想稍后阅读:
int integer = 0;
buffer.read(reinterpret_cast<char*>(&integer), sizeof(int));
您无需事先指定长度。如果您之后需要长度,可以使用以下内容:
buffer.str().size();
希望这会有所帮助..
答案 1 :(得分:1)
是的,当然。
数据缓冲区有两个指针。一个put和一个get指针。解释它的最简单的方法就是说put是写作而get是读取
因此,找到put指针的位置可以这样做:
尝试这样的事情:
//Get the offset where the write pointer is..
std::streamoff offset = buffer.tellp();
//Write 'dummy' value
buffer.write(reinterpret_cast<char*>(&integer), sizeof(int));
.
.
.
(do other writing)
.
.
.
//Scroll to offset (from start)
buffer.seekp(offset);
//Write real value
buffer.write(reinterpret_cast<char*>(&integer), sizeof(int));
好的,那就是如果你想从头开始滚动到一个偏移量。 如果您想从当前位置滚动,请查看以下内容:
buffer.seekp(offset, std::ios_base::cur);