对于数据记录应用程序,我将不得不将一些(先前)未知大小的块写入文件中。为了方便阅读,我想添加有关块大小的信息。与RAM的大小相比,数据可能很大,因此在RAM中使用缓冲区的解决方案并不是一个好主意。
我的计划是在块的开头保留int
,用tellp
存储其位置,然后写入块并计算其大小,然后返回到长度信息的位置,写下实际尺寸:
// 1. some stuff was written to the file here
// 2. reserve space for block length information and store its position:
long len = 0;
off_t pos = outfile.tellp(); // get position where len will be stored
outfile.write(&len, sizeof(long)); // write a dummy len
// 3. a block of previously unknown length is written to the file here
// 4. return to the position of the block length and write the actual size:
outfile.seekp (pos);
outfile.write (&len,sizeof(long));
这是实现我想要的合理方式还是有明显的缺点/问题/陷阱?
答案 0 :(得分:1)
您的序列化方法不是很划清,但是,是的,基本前提是声音。
我采用与此类似的方法,在生成时返回到大型二进制日志文件的开头,以更新在文件开头找到的“索引”块,以帮助稍后遍历生成的数据。
不要忘记以下内容:
10
成为别的东西; uint64_t
。当然,如果您有任何方法可以提前预测块大小,那么您可以避免所有的搜索。 :)