C ++截断iostream类

时间:2012-01-21 04:15:07

标签: c++ file iostream truncate stringstream

对于我正在处理的用于在文件中加载/存储数据的项目,我决定实现iostream库,因为它保留了其他文件io库的一些功能。一个这样的特性是能够使用派生的fstream或stringstream类来允许从文件或内存中已存在的位置加载数据。虽然到目前为止,有一个主要的后备,但我一直无法获得有关它的信息。

与POSIX库中可用的函数类似,我正在寻找truncate或ftruncate函数的一些实现。对于stringstream,这就像使用不同的大小重构它之后将关联的字符串传递回流一样简单。对于fstream,我还没有找到任何方法这样做,实际上,因为我甚至找不到一种方法将句柄拉出这个类的文件。虽然给我一个解决fstream问题的解决方案会很棒,但是对这个问题更好的解决方案必须是iostream友好的。因为任何一个流类的使用都经过我程序中的iostream,所以通过基类截断它们会比在每次我想要改变整体大小时必须找出控制流的类更容易。

或者,如果有人可以指向一个实现我正在寻找的所有这些功能的库,并且可以轻松地替换iostream,那么这也是一个很好的解决方案。

编辑:为了澄清,我正在使用的iostream类更可能只使用stringstream和fstream类。实际上,只需要将文件本身截断到某一点,我只是想找到一种更简单的方法来处理这个问题,这并不需要我知道流附加到哪种类型的streambuf。正如答案所示,我将研究一种在fstream中使用ftruncate的方法,并且只处理两个特定情况,因为我的程序的最终用户不应该看到流类。

1 个答案:

答案 0 :(得分:0)

您无法截断iostream。您必须将现有流中的前N个字节复制到新的字节。这可以使用基础sgetn()对象的sputn()streambuf方法来完成,您可以通过iostream::rdbuf()获取这些方法。

但是,该过程可能是I / O密集型的。如您所述,使用特殊情况来操纵std::string或致电ftruncate可能会更好。

如果你想真的积极,你可以创建一个自定义std::streambuf衍生类,它保持指向流中预先存在的rdbuf对象的指针,并且只读取在生成人工文件结束之前达到某一点。这将使用户看起来像一个较短的I / O序列,但实际上不会释放内存或文件系统空间。 (目前尚不清楚这对你来说是否重要。)