C++ Truncating an iostream Class

C++ Truncating an iostream Class

本文关键字:Class iostream an Truncating C++      更新时间:2023-10-16

对于我正在进行的在文件中加载/存储数据的项目,我决定实现iostream库,因为它比其他文件io库具有一些功能。一个这样的特性是能够使用派生的fstream或stringstream类来允许从文件或内存中已经存在的位置加载数据。不过,到目前为止,有一个主要的后备方案,我已经很难获得有关它的信息一段时间了。

与POSIX库中可用的函数类似,我正在寻找truncate或ftruncate函数的一些实现。对于字符串流来说,这就像在用不同的大小重建相关字符串后将其传递回流一样容易。事实上,对于fstream,我还没有找到任何方法来实现这一点,因为我甚至找不到从这个类中提取文件句柄的方法。虽然给我一个fstream问题的解决方案会很好,但这个问题的更好解决方案必须是iostream友好的。因为在我的程序中,任何一个流类的每次使用都要经过iostream,所以通过基类截断它们会更容易,而不是每次我想更改整体大小时都要弄清楚哪个类在控制流。

或者,如果有人能给我指一个实现我正在寻找的所有这些功能的库,并且用它来替换iostream稍微容易一点,那也是一个很好的解决方案。

编辑:为了澄清,我使用的iostream类更有可能只使用stringstream和fstream类。实际上,只有文件本身需要被截断到某一点,我只是在寻找一种更简单的方法来处理它,这不需要我知道流连接到哪种类型的streambuf。正如答案所示,我将研究一种在fstream旁边使用ftruncate的方法,只处理这两种特定情况,因为我的程序的最终用户无论如何都不应该看到流类。

您不能在适当的位置截断iostream。您必须将现有流中的前N个字节复制到新的流中。这可以通过底层streambuf对象的sgetn()sputn()方法来完成,可以通过iostream::rdbuf()获得。

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

如果您想让真正地具有攻击性,您可以创建一个自定义std::streambuf派生类,该类将指针保留到流中预先存在的rdbuf对象,并且在生成人工文件结尾之前只读取到某个点。在用户看来,这将是一个较短的I/O序列,但实际上不会释放内存或文件系统空间。(目前还不清楚这对你是否重要。)