Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C/C+编写/创建大于2GB的文件+;_C++_C_Large Files - Fatal编程技术网

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

C++ 如何使用C/C+编写/创建大于2GB的文件+;,c++,c,large-files,C++,C,Large Files,我尝试使用write()函数将一大块内存写入一个文件(超过2GB),但从未成功。有人能友善地告诉我该怎么做吗?这取决于操作系统、处理器和文件系统。在Linux/x86-64系统(使用ext3文件系统)上,这样做很简单。只需使用常用的库函数(在C++代码> STD::OFFROWS ,在C , fopen < //>代码> fPINTFF < /COD>等)或基础系统调用(打开、写入).< /P> < P>假设Linux: 将\u文件\u偏移量\u位定义为64。(gcc-D\u文件\u偏移量\

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

这取决于操作系统、处理器和文件系统。在Linux/x86-64系统(使用ext3文件系统)上,这样做很简单。只需使用常用的库函数(在C++代码> STD::OFFROWS ,在C<代码> <代码>,<代码> fopen < //>代码> fPINTFF < /COD>等)或基础系统调用(打开、写入).< /P> < P>假设Linux:

  • \u文件\u偏移量\u位定义为64。(
    gcc-D\u文件\u偏移量\u位=64
  • 定义
    \u LARGEFILE\u SOURCE
    \u LARGEFILE\u SOURCE64
  • 使用打开的
    O_LARGEFILE
    标志对大文件进行操作
还有一些信息:


现在,系统上的文件系统将支持开箱即用的大文件。

-D_file\u OFFSET_BITS=64
添加到编译器命令行(也称为
CFLAGS
)中,它将正常工作。这在任何64位系统上都是不必要的,在一些(但不是所有)32位系统上也不必要

避免建议您在源代码中编写
O_大文件
open64
等。这是不可移植的,很简单,很难看


编辑:事实上,我认为我们都误读了你的问题。如果您在32位系统上,内存中最大的单个对象可能是2GB-1字节(即
SSIZE_MAX
)。根据POSIX,未定义无法放入
ssize_t
的大小参数的
write
行为;这是因为
write
返回type
ssize\u t
,如果较大,则无法表示写入的字节数。也许更重要的是,对于一个实现来说,允许对象太大以至于它们的大小不适合
ptrdiff\u t
,这是很危险的,因为这会造成指针算法调用整数溢出从而导致未定义行为的情况。您可能已经创建了这样一个大对象,用<代码> MMAP(我会认为这是系统内核或LBC中的一个bug),但这是一个非常糟糕的想法,并且会导致各种错误。如果您需要大于2GB的单个对象,您确实需要在64位计算机上运行,以确保其安全和无bug。

我们讨论的是什么文件系统和操作系统?您是如何编写的?一段代码片段就好了。相关:只有步骤1是必要的或有益的。2-4是假的/过时的/对便携性有害。嘿,我试过了。事实上,通过使用fopen64,我现在可以创建一个最大大小为4GB的文件。但我需要更大的。无论如何,谢谢你的建议。