在不知道总大小的情况下写入变量

时间:2014-05-23 13:05:46

标签: c++ c data-structures

我需要修改现有功能,即根据系统配置创建文件。事先不知道创建的文件的总大小。因此,原始函数只是创建一个文件并将所有内容转储到其中。它甚至在内存中保留一些偏移量并在此过程中更新文件。

我不允许在磁盘上创建文件。我需要将所有内容保存在一个变量中。但是,我事先并不知道总的大小。

您能为我建议一个这种情况的数据结构吗?

2 个答案:

答案 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);