【发布时间】:2012-04-06 10:23:01
【问题描述】:
我尝试使用 write() 函数将一大块内存写入文件(超过 2GB),但从未成功。有人可以告诉我该怎么做吗?
【问题讨论】:
-
我们在谈论什么文件系统和操作系统?
-
你是怎么写的?一个代码 sn-p 会很好。
标签: c++ c large-files
我尝试使用 write() 函数将一大块内存写入文件(超过 2GB),但从未成功。有人可以告诉我该怎么做吗?
【问题讨论】:
标签: c++ c large-files
假设 Linux :)
https://users.suse.com/~aj/linux_lfs.html
_FILE_OFFSET_BITS 定义为64。(gcc -D_FILE_OFFSET_BITS=64)_LARGEFILE_SOURCE 和_LARGEFILE_SOURCE64。O_LARGEFILE 标志和 open 对大文件进行操作还有一些信息: http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
如今,您系统上的文件系统将支持开箱即用的大文件。
【讨论】:
将-D_FILE_OFFSET_BITS=64 添加到您的编译器命令行(又名CFLAGS),它就会工作。这在任何 64 位系统上都不是必需的,如今在某些(但不是全部)32 位系统上也是不必要的。
避免建议在您的源代码中到处写 O_LARGEFILE 或 open64 等。这是不可移植的,而且很简单,很丑。
编辑:实际上,我认为我们都误读了您的问题。如果您在 32 位系统上,内存中最大可能的单个对象是 2GB-1byte(即SSIZE_MAX)。根据 POSIX,未定义 write 对于不适合 ssize_t 的大小参数的行为;这是因为 write 返回类型 ssize_t 并且如果它更大,则无法表示写入的字节数。或许更重要的是,对于一个实现来说,允许对象如此之大以至于它们的大小不适合ptrdiff_t 是很危险的,因为这会造成指针算术可能引发整数溢出并因此导致未定义行为的情况。您可能已经能够使用mmap 创建如此大的对象(我认为这是您系统内核或 libc 中的错误),但这是一个非常糟糕的主意,并且会导致各种错误。如果您需要大于 2GB 的单个对象,则确实需要在 64 位机器上运行才能安全且无错误。
【讨论】:
这取决于操作系统、处理器、文件系统。在 Linux/x86-64 系统(带有 ext3 文件系统)上,这很简单。只需使用常用的库函数(在 C++ 中 std::ofstream、在 C 中 <stdio.h>、fopen && fprintf 等)或底层系统调用(打开、写入)。
【讨论】: