我试着用write()函数把一大块内存写入一个文件(超过2GB),但是从来没有成功过。有人能告诉我该怎么做吗?
7hiiyaii1#
假设是Linux:)https://users.suse.com/~aj/linux_lfs.html
_FILE_OFFSET_BITS
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现在,您系统上的文件系统将支持开箱即用的大文件。
bkhjykvo2#
在你的编译器命令行中添加-D_FILE_OFFSET_BITS=64(aka CFLAGS)就可以了,这在任何64位系统上都是不必要的,现在在一些(但不是所有)32位系统上也是不必要的。不要建议在源代码中到处写O_LARGEFILE或open64等,这是不可移植的,而且很简单,很难看。
-D_FILE_OFFSET_BITS=64
CFLAGS
open64
**编辑:**实际上,我想我们都误解了你的问题。如果你在一个32位系统上,内存中最大的单个对象可能是2GB-1字节(即SSIZE_MAX)。对于POSIX,write对于大小参数不能适合ssize_t的行为是没有定义的;这是因为write返回类型ssize_t,并且如果它更大则不能表示写入的字节数。也许更重要的是,对于实现来说,允许对象太大以至于它们的大小不适合ptrdiff_t是危险的,因为这将产生指针运算可能调用整数溢出并因此调用未定义行为的情况。您可能已经能够使用mmap创建这么大的对象(我认为这是系统内核或libc中的一个bug),但这是一个非常糟糕的主意,会导致各种bug。您确实需要在64位机器上运行,以确保它的安全和无错误。
SSIZE_MAX
write
ssize_t
ptrdiff_t
mmap
ddhy6vgd3#
这取决于操作系统、处理器和文件系统。在Linux/x86-64系统(使用ext 3文件系统)上,这是很容易做到的。只需使用常用的库函数(C++ std::ofstream,C <stdio.h>,fopen & fprintf等)或底层系统调用(open,write)。
std::ofstream
<stdio.h>
fopen
fprintf
3条答案
按热度按时间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
现在,您系统上的文件系统将支持开箱即用的大文件。
bkhjykvo2#
在你的编译器命令行中添加
-D_FILE_OFFSET_BITS=64
(akaCFLAGS
)就可以了,这在任何64位系统上都是不必要的,现在在一些(但不是所有)32位系统上也是不必要的。不要建议在源代码中到处写
O_LARGEFILE
或open64
等,这是不可移植的,而且很简单,很难看。**编辑:**实际上,我想我们都误解了你的问题。如果你在一个32位系统上,内存中最大的单个对象可能是2GB-1字节(即
SSIZE_MAX
)。对于POSIX,write
对于大小参数不能适合ssize_t
的行为是没有定义的;这是因为write
返回类型ssize_t
,并且如果它更大则不能表示写入的字节数。也许更重要的是,对于实现来说,允许对象太大以至于它们的大小不适合ptrdiff_t
是危险的,因为这将产生指针运算可能调用整数溢出并因此调用未定义行为的情况。您可能已经能够使用mmap
创建这么大的对象(我认为这是系统内核或libc中的一个bug),但这是一个非常糟糕的主意,会导致各种bug。您确实需要在64位机器上运行,以确保它的安全和无错误。ddhy6vgd3#
这取决于操作系统、处理器和文件系统。在Linux/x86-64系统(使用ext 3文件系统)上,这是很容易做到的。只需使用常用的库函数(C++
std::ofstream
,C<stdio.h>
,fopen
&fprintf
等)或底层系统调用(open,write)。