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

时间:2012-04-06 10:23:02

标签: c++ c large-files

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

3 个答案:

答案 0 :(得分:3)

假设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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

避免在您的来源上撰写O_LARGEFILEopen64等建议。这是不可携带的,非常简单,丑陋。

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