繁体   English   中英

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

[英]How can I write/create a file larger than 2GB by using C/C++

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

假设 Linux:)

https://users.suse.com/~aj/linux_lfs.html

  • _FILE_OFFSET_BITS定义为 64。 ( gcc -D_FILE_OFFSET_BITS=64 )
  • 定义_LARGEFILE_SOURCE_LARGEFILE_SOURCE64
  • 使用带有 open 的O_LARGEFILE标志对大文件进行操作

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

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

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

避免向 go 建议在整个源代码中写入O_LARGEFILEopen64等。 这是不可移植的,而且很简单,很丑。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM