在C++中调整文件大小

4
我很惊讶地发现,使用C++标准库没有找到合理的解决方案来调整文件大小。从原始文件读取数据,然后将其写入不同的文件似乎非常愚蠢和浪费。我只是想要一个调整大小的方法,可以裁剪超出指定大小的数据...有这样的方法吗?
编辑:如果我必须使用上述方法,那么我使用的缓冲区应该有多大?显然,我不能一次性读取整个文件,因为我正在处理相当大的文件。

这会导致文件碎片化,需要进行清理,但你可以用 EOF 字符覆盖文件的末尾。 - Precastic
这里的大局是什么?“调整大小”有很多含义! - Mahmoud Al-Qudsi
在您的项目中调用操作系统API是否被允许?Linux有一个系统调用truncate,可以将文件设置为指定的长度。我认为Windows也会提供类似的API。顺便问一下,您使用的是哪个平台? - Summer_More_More_Tea
<unistd.h> 中的 truncate() 是 POSIX C 库的一部分,这个可以用吗? - trutheality
@Summer_More_More_Tea 调用操作系统 API 是可以的,但这是一个跨平台的项目。只要我为每个平台都有解决方案,我就可以使用预处理器。 - hetelek
正如@trutheality所指出的那样,truncate是一个POSIX API。因此,跨平台并不是那么大的问题,只要您的操作系统API兼容POSIX标准即可。祝好运! - Summer_More_More_Tea
4个回答

8
你可以使用Boost.Filesystem提供的函数,特别是它的resize_file()函数。
请注意,Boost.Filesystem计划包含在未来版本的语言标准中。查看此处。如果你不想在项目中使用Boost,这是一个好消息。
此外,正如@BenjaminLindley所提到的,<filesytem>头文件已经在Visual Studio 2012中可用(在此处查看;搜索“filesystem”)。

谢谢您的回复,但不幸的是我的项目并不依赖于Boost库,我希望保持这种状态。 - hetelek
1
@hetelek 为什么不呢?你可能不会使用它提供的所有功能,但肯定会发现其中一些部分可以节省大量开发时间。 - Mark Garcia
@MarkGarcia 我并不反对使用Boost,但我有一个大项目,在其中没有任何其他依赖于Boost的地方,我不会仅仅为了这个而使用它,而不返回并更改它们所有。此外,我只是喜欢它完全依赖于标准库的事实。 - hetelek
4
那就直接在你的项目中重新实现boost文件系统。它是开源的,代码就在那里。开始动手吧。 - Yakk - Adam Nevraumont
3
如果您正在使用 Visual Studio 11,<filesystem>头文件已经存在。我相信其他主要的供应商很快也会跟进。 - Benjamin Lindley


1

实际上,没有跨平台的方法来调整文件大小,因为标准没有描述这个功能。但是,正如这里所述,有针对此目的的平台API:在Windows中查看_chsize()函数,在POSIX系统中查看truncate()和ftruncate()函数。


-1

即使对于高级语言来说,不加载完整图像进行文件调整大小也是相当复杂的任务,这主要是图像处理 SDK(如Image Magick)的特性。

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


谢谢回答问题。我想我会选择读/写方法。 - hetelek
2
你从哪里获取图片?楼主没有提到。 - Mahmoud Al-Qudsi
这是错误的。不幸的是,我无法删除已接受的答案。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接