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

2eafrhcq  于 2023-03-17  发布在  C/C++
关注(0)|答案(3)|浏览(389)

我试着用write()函数把一大块内存写入一个文件(超过2GB),但是从来没有成功过。有人能告诉我该怎么做吗?

7hiiyaii

7hiiyaii1#

假设是Linux:)
https://users.suse.com/~aj/linux_lfs.html

  • _FILE_OFFSET_BITS定义为64。(gcc -D_FILE_OFFSET_BITS=64
  • 定义_LARGEFILE_SOURCE_LARGEFILE64_SOURCE
  • O_LARGEFILE标志与open()一起使用以操作大文件

还有一些信息:http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
现在,您系统上的文件系统将支持开箱即用的大文件。

bkhjykvo

bkhjykvo2#

在你的编译器命令行中添加-D_FILE_OFFSET_BITS=64(aka CFLAGS)就可以了,这在任何64位系统上都是不必要的,现在在一些(但不是所有)32位系统上也是不必要的。
不要建议在源代码中到处写O_LARGEFILEopen64等,这是不可移植的,而且很简单,很难看。

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

ddhy6vgd

ddhy6vgd3#

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

相关问题