如何使用C/C++编写/创建大于2GB的文件
How can I write/create a file larger than 2GB by using C/C++
我试图使用write()函数将一大块内存写入一个文件(超过2GB),但从未成功。有人能友善地告诉我该怎么办吗?
假设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-打开64-931
现在,您系统上的文件系统将支持开箱即用的大文件。
将-D_FILE_OFFSET_BITS=64
添加到编译器命令行(也称为CFLAGS
)中,它就可以工作了。这在任何64位系统上都没有必要,现在在一些(但不是所有)32位系统上也没有必要。
避免建议在你的源代码中写O_LARGEFILE
或open64
等。这是不可移植的,而且很简单,很难看。
编辑:事实上,我想我们都误解了你的问题。如果您使用的是32位系统,那么内存中最大的单个对象可能是2GB-1字节(即SSIZE_MAX
)。根据POSIX,未定义write
对于无法容纳在ssize_t
中的大小参数的行为;这是因为CCD_ 14返回类型CCD_。也许更重要的是,对于一个实现来说,允许太大的对象以至于它们的大小不适合ptrdiff_t
是危险的,因为这会导致指针算术可能调用整数溢出,从而导致未定义的行为。您可能已经能够用mmap
创建这么大的对象(我认为这是系统内核或libc中的一个错误),但这是一个非常糟糕的想法,会导致各种错误。如果你需要大于2GB的单个对象,你真的需要在64位机器上运行,这样它才能安全无错误。
它取决于操作系统、处理器和文件系统。在Linux/x86-64系统(带有ext3文件系统)上,这很简单。只需使用常用的库函数(在C++std::ofstream
、在C <stdio.h>
、fopen
&&fprintf
等中)或底层系统调用(打开、写入)即可。
- 大于65535的C++数组[size]引发不一致的溢出
- 查找最接近的大于当前数字的数字的索引
- OpenGL大的3D纹理(>2GB)非常慢
- 如何找到大于整数的最小数字
- 为什么签名字符可以保存大于 127 的值?
- 如何打印大于"无符号长长"的"std::bitset"的十进制值?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 为什么它总是给我大于 4?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- CStdioFile 不能处理大于 2GB 的文件?
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- 使用 new in C++(在 Windows 上)分配大于 2GB 的单个对象
- 编写大于2GB的文件
- 如何使用C/C++编写/创建大于2GB的文件
- 如何使用OpenCV编写大于2GB的avi文件
- 无法在 Ubuntu 64 位操作系统中读取大于 2GB 的文件
- libcurl + openssl不能下载大于2GB的文件
- 如何在c++中使用fstream将数据写入大于2GB的文件