C++ fstream从选定的点中删除文件内容

Sud*_*ha 4 c++ file-io visual-c++

我需要从选定的点(C++ fstream)中删除文件内容,我应该使用哪个函数?

我写了objects,我需要objects在文件中间删除这些

Mar*_*tos 7

C++没有标准机制来截断给定点的文件.您必须重新创建文件(打开ios::trunc并写入要保留的内容)或使用特定SetEndOfFile于操作系统的API调用(在Windows上truncateftruncate在Unix上).

编辑:删除文件中间的东西是一个非常不稳定的业务.在考虑任何其他替代方案之前,我会尝试使用像SQLite这样的无服务器数据库引擎来存储序列化对象.更好的是,我会按照预期使用SQLite,将这些对象所需的数据存储在适当的模式中.

编辑2:如果问题陈述需要原始文件访问...

作为一般规则,您不会从文件中间删除数据.如果可以将对象序列化为磁盘上的固定大小,则可以将它们作为记录使用,而不是尝试删除数据,而是使用索引文件中的记录的表.例如,如果按顺序写入四个记录,则表格将保留[0, 1, 2, 3].要删除第二条记录,只需从表中删除其条目:[0, 2, 3].至少有两种方法可以重用表格留下的漏洞:

  1. 在每次插入时,扫描第一个未使用的索引并将对象写在相应的记录位置.但是,随着文件的增长,这将变得更加昂贵.
  2. 保持免费清单.将最近释放的记录的索引存储为单独的变量.在该记录占用的空间中编码在其之前释放的记录的索引,依此类推.这保留了一个方便的免费记录链表,同时只需要一个额外数字的空间.但是,使用它会更复杂,并且在删除和插入时需要额外的磁盘I/O.

如果对象无法序列化为固定长度,那么这种方法变得更加困难.可变长度记录管理代码非常复杂.

最后,如果问题陈述要求在磁盘上按顺序保存记录,那么这是一个愚蠢的问题陈述,因为在文件中间插入/删除是非常昂贵的; 没有理智的设计需要这个.