在 C++ 11 中切断 fstream 文件结尾的最佳方法是什么
我正在编写一个数据持久性类来为我的音频编辑器存储音频。我选择使用 fstream(可能是个坏主意)来创建随机访问二进制读写文件。
每次我在我的文件中录制一点声音时,我只是将它附加到这个文件的末尾。另一个内部数据结构/文件,包含指向音频文件的指针并跟踪编辑。
当我撤消录制操作然后执行其他操作时,音频文件的最后一位变得无关紧要。它未在文档的当前状态中引用,您无法将自己恢复到可以再次看到它的状态。所以我想切掉文件的这一部分并在新的一端开始录制。我不需要在中间切掉比特,就在最后。
当用户退出时,该文件将保留并在他们再次打开项目时重新加载。
在我的应用程序中,我希望用户一直这样做,并且能够这样做可能会为我节省多达 30% 的文件大小。这个文件会很长,可能非常非常长,所以每次发生这种情况时都将它重写到另一个文件不是一个可行的选择。
当用户保存时重写它可能是一种选择,但它仍然没有那么吸引人。
我可以在开头贴上一个值,说明文件应该有多长,然后覆盖末尾以回收空间,但与此同时。如果我想在崩溃的情况下不断更新数据存储文件,这意味着我将一遍又一遍地重写开始。我担心这可能对闪存驱动器不利。我还可以通过分析指针文件重新计算加载文件有用部分的末尾,但与此同时我可能会浪费所有这些空间,这很复杂。
在 fstream API 中是否有对此的简单调用?
我是否使用了错误的库?请注意,我想坚持使用我喜欢的通用 STL,这样我就可以使代码尽可能跨平台。
我好像在文档里找不到,找了好几个小时。这不是地球的尽头,但会让这更简单一点,并可能更有效。也许我只是以某种方式想念它。
感谢您的帮助 安德烈”
最佳答案
Is there a simple call for this in the fstream API?
如果你有 C++17 编译器,那么使用 std::filesystem::resize_file
.在以前的标准中,标准库中没有这样的东西。
对于较旧的编译器...在 Windows 上您可以使用 SetFilePointer
或 SetFilePointerEx
将当前位置设置为您想要的大小,然后调用 SetEndOfFile
.在 Unix 上你可以使用 truncate
或 ftruncate
.如果你想要可移植的代码,那么你可以使用 Boost.Filesystem .以后迁移到std::filesystem
是最简单的,因为std::filesystem
大多是基于它指定的。
关于c++ - 如何在 C++ 中减小 fstream 文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53003314/