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