【问题标题】:Resizing a file in C++在 C++ 中调整文件大小
【发布时间】:2013-06-19 02:50:41
【问题描述】:

我很惊讶地说,我还没有找到一个合理的解决方案来解决如何使用 C++ 标准库来调整文件大小。必须从原始文件中读取数据,然后将其写入另一个文件,这似乎是完全愚蠢和浪费的。我只是想要一个调整大小的方法来切断超出该大小的数据......有什么可以做到这一点吗?

编辑:如果我必须使用上面解释的方法,我用来读/写的缓冲区应该有多大?我显然无法一次读取整个文件,因为我在这里处理的是相当大的文件。

【问题讨论】:

  • 这会导致文件碎片,您必须清理这些碎片,但您可以用 EOF 字符覆盖文件末尾?
  • 这里的大局是什么? “调整大小”有很多含义!
  • 您的项目中是否允许调用 OS API? Linux 有一个系统调用truncate 将文件设置为指定长度。我认为 Windows 会提供比较 API。顺便说一句,你的平台是什么?
  • truncate() in <unistd.h> 是 POSIX C 库的一部分,可以吗?
  • @Summer_More_More_Tea 调用 OS API 是可以的,但这是一个跨平台项目。只要我有适用于每个平台的解决方案,我就可以使用预处理器。

标签: c++ file resize


【解决方案1】:

您可以使用Boost.Filesystem提供的功能,特别是它的resize_file()功能。

请注意,Boost.Filesystem 已(计划)包含在语言标准的未来迭代中。见here。如果您不想在项目中使用 Boost,这是个好消息。

此外,正如@BenjaminLindley 所提到的,<filesytem> 标头已在 Visual Studio 2012 中可用(see here;搜索“文件系统”)。

【讨论】:

  • 谢谢你,但不幸的是我的项目不依赖于 Boost,我想保持这种方式。
  • @hetelek 为什么不呢?您可能不会使用它提供的所有功能,但您肯定会发现其中的某些部分可以节省您的大部分开发时间。
  • @MarkGarcia 我对 Boost 没有任何意见,但我有一个不依赖于任何其他地方的 boost 的大型项目,我不会只为此使用它而不返回并更改它们。此外,我只是喜欢它只依赖于标准库的事实。
  • @hetelek 然后在您的项目中简单地重新实现 boost 文件系统。它是开源的,代码就在那里。开始输入...
  • 如果您使用的是 Visual Studio 11,<filesystem> 标头已经存在。我相信其他主要供应商很快就会效仿。
【解决方案2】:

【讨论】:

    【解决方案3】:

    确实,没有用于调整文件大小的跨平台方法,因为标准没有描述此功能。 但是,正如 here 所说,有用于此目的的平台 API:请参阅适用于 Windows 的 _chsize() 函数、适用于 POSIX 系统的 truncate() 和 ftruncate() 函数。

    【讨论】:

      【解决方案4】:

      在不加载完整图像的情况下调整文件大小是相当复杂的任务,即使对于高级语言也是如此,它主要是图像处理 SDK 的一个功能,例如 Image Magick

      如果对调整大小质量或支持的格式没有具体要求,我想 Mark 的回答将是最简单的方法。否则,您需要包含图形格式库并手动实现一些调整大小算法(或者也使用一些库)。

      【讨论】:

      • 感谢您回答问题。我想我会选择读/写的方法。
      • 您从哪里获得图像/图片? OP 零提及。
      • 这里是错误的。很遗憾,我无法删除已接受的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多