C++ Truncating an iostream Class
C++ Truncating an iostream Class
对于我正在进行的在文件中加载/存储数据的项目,我决定实现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序列,但实际上不会释放内存或文件系统空间。(目前还不清楚这对你是否重要。)
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 需要从 istream 和 ostream 派生 iostream
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- std::带有自定义缓冲区的 iostream 不允许我写入
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- 新的放置取决于 iostream
- 包含在 <initializer_list> <iostream>?
- 为什么在包含iostream时可以使用printf()?
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- C++ class iostream overloading
- C++ Truncating an iostream Class