在C中使用fwrite时,文件大小限制为2GB?

我有一个简短的C程序写入文件,直到磁盘上没有更多的空间:

#include  int main(void) { char c[] = "abcdefghij"; size_t rez; FILE *f = fopen("filldisk.dat", "wb"); while (1) { rez = fwrite(c, 1, sizeof(c), f); if (!rez) break; } fclose(f); return 0; } 

当我运行程序(在Linux中)时,它会在文件达到2GB时停止。

由于FILE结构,是否存在内部限制?

谢谢。

在32位系统(即OS是32位)上,默认情况下,fopen和co限制为32位大小/偏移/等等…您需要启用大文件支持,或使用* 64位选项:

http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931

然后你的fs需要支持这个,但除了fat和其他原始fs之外,所有这些都支持创建> 2 gb的文件。

文件达到2GB时停止。

由于FILE结构,是否存在内部限制?

这是由于libc(标准C库),默认情况下在x86(IA-32)Linux系统上是由glibc(GNU的C库)提供的32位函数。 因此,默认情况下, 文件流大小基于32位 – 2 ^(32-1)。

有关使用大文件支持的信息 ,请参阅网页。

 #define _FILE_OFFSET_BITS 64 /* or more commonly add -D_FILE_OFFSET_BITS=64 to CFLAGS */ #include  int main(void) { char c[] = "abcdefghij"; size_t rez; FILE *f = fopen("filldisk.dat", "wb"); while (1) { rez = fwrite(c, 1, sizeof(c), f); if ( rez < sizeof(c) ) { break; } } fclose(f); return 0; } 

注意:大多数系统期望fopen(和off_t)基于2 ^ 31文件大小限制。 用off64_tfopen64替换它们会使这fopen64变得明确, 并且取决于使用情况可能是最好的方法。 但一般不推荐,因为它们是非标准的。