如何使用C/C++编写/创建大于2GB的文件

How can I write/create a file larger than 2GB by using C/C++

本文关键字:2GB 大于 文件 创建 编写 何使用 C++      更新时间:2023-10-16

我试图使用write()函数将一大块内存写入一个文件(超过2GB),但从未成功。有人能友善地告诉我该怎么办吗?

假设Linux:)

https://users.suse.com/~aj/linux_lfs.html

  • _FILE_OFFSET_BITS定义为64。(gcc -D_FILE_OFFSET_BITS=64
  • 定义_LARGEFILE_SOURCE_LARGEFILE64_SOURCE
  • 使用O_LARGEFILE标志和open()对大文件进行操作

还有一些信息:http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-打开64-931

现在,您系统上的文件系统将支持开箱即用的大文件。

-D_FILE_OFFSET_BITS=64添加到编译器命令行(也称为CFLAGS)中,它就可以工作了。这在任何64位系统上都没有必要,现在在一些(但不是所有)32位系统上也没有必要。

避免建议在你的源代码中写O_LARGEFILEopen64等。这是不可移植的,而且很简单,很难看。

编辑:事实上,我想我们都误解了你的问题。如果您使用的是32位系统,那么内存中最大的单个对象可能是2GB-1字节(即SSIZE_MAX)。根据POSIX,未定义write对于无法容纳在ssize_t中的大小参数的行为;这是因为CCD_ 14返回类型CCD_。也许更重要的是,对于一个实现来说,允许太大的对象以至于它们的大小不适合ptrdiff_t是危险的,因为这会导致指针算术可能调用整数溢出,从而导致未定义的行为。您可能已经能够用mmap创建这么大的对象(我认为这是系统内核或libc中的一个错误),但这是一个非常糟糕的想法,会导致各种错误。如果你需要大于2GB的单个对象,你真的需要在64位机器上运行,这样它才能安全无错误。

它取决于操作系统、处理器和文件系统。在Linux/x86-64系统(带有ext3文件系统)上,这很简单。只需使用常用的库函数(在C++std::ofstream、在C <stdio.h>fopen&&fprintf等中)或底层系统调用(打开、写入)即可。