【问题标题】:How can I write/create a file larger than 2GB by using C/C++如何使用 C/C++ 编写/创建大于 2GB 的文件
【发布时间】:2012-04-06 10:23:01
【问题描述】:

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

【问题讨论】:

标签: c++ c large-files


【解决方案1】:

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

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

【讨论】:

  • 只有第 1 步是必要的或有益的。 2-4 是伪造的/过时的/对便携性有害。
  • 嘿,我试过了。事实上,通过使用 fopen64,我现在可以创建一个最大 sizeo 为 4GB 的文件。但我需要更大。无论如何,谢谢你的建议。
【解决方案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 位机器上运行才能安全且无错误。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多