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

我尝试使用write()函数将大块内存写入一个文件(超过2GB),但从未成功。 有人可以很好并告诉我该怎么做?

假设Linux 🙂

http://www.suse.de/~aj/linux_lfs.html

1 /定义_FILE_OFFSET_BITS到64 2 /定义_LARGEFILE_SOURCE和_LARGEFILE_SOURCE64 4 /使用O_LARGEFILE标志打开以操作大文件

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

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

它取决于操作系统,处理器,文件系统。 在Linux / x86-64系统(使用ext3文件系统)上,这很简单。 只需使用常用的库函数(在C ++ std::ofstream ,在C fopen && fprintf等)或底层系统调用(open,write)。

-D_FILE_OFFSET_BITS=64添加到编译器命令行(也称为CFLAGS ),它将起作用。 这在任何64位系统上都不是必需的,而且现在在一些(但不是全部)32位系统上也是不必要的。

避免建议在您的源代码中编写O_LARGEFILEopen64等。 这是非便携式的,非常简单,丑陋。

编辑:实际上,我认为我们都误解了你的问题。 如果您使用的是32位系统,则内存中最大的单个对象是2GB-1byte(即SSIZE_MAX )。 根据POSIX,未定义不适合ssize_t大小参数的write行为; 这是因为write返回类型ssize_t并且如果它更大则不能表示写入的字节数。 也许更重要的是,实现允许对象如此之大以至于它们的大小不适合ptrdiff_t是危险的,因为这会产生指针算术可以调用整数溢出并因此调用未定义行为的情况。 您可能已经能够使用mmap创建这样一个大对象(我认为这是系统内核或libc中的一个错误),但这是一个非常糟糕的主意,并会导致各种错误。 如果您需要大于2GB的单个对象,您确实需要在64位计算机上运行才能使其安全且无错误。