2

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

4

3 回答 3

4

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

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

于 2012-04-06T10:30:30.713 回答
3

添加-D_FILE_OFFSET_BITS=64到您的编译器命令行(又名CFLAGS),它会工作。这在任何 64 位系统上都不是必需的,如今在某些(但不是全部)32 位系统上也是不必要的。

避免建议在您的源代码中进行写作等O_LARGEFILEopen64这是不可移植的,而且很简单,丑陋。

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

于 2012-04-06T13:04:04.403 回答
2

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

于 2012-04-06T10:27:32.183 回答