使用C语言中的fwrite函数时,文件大小的限制是2GB吗?

23

我有一个简短的C程序,它会向文件中写入数据,直到磁盘没有剩余空间为止:

#include <stdio.h>

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结构或其他原因存在内部限制?

谢谢。


2
这听起来像是32位整数的正1/2。 - Joel Coehoorn
你的硬盘格式化为哪种文件系统? - eduffy
Linux说“vfat”,这是FAT32吧。这是一个4GB的闪存驱动器,最初(几乎)为空。 - Gabriel
vfat(FAT32)每个文件的限制都是2GB,无论你用什么编码方式都没有影响。 - Mike Cooper
http://support.microsoft.com/kb/314463 XP的FAT文件大小限制为4GB-1B。我曾经认为Linux的VFAT会限制在2GB,但现在阅读源代码后我认为我错了。 - ephemient
显示剩余2条评论
2个回答

28

12

当文件达到2GB时会停止。

这是由于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 <stdio.h>

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 可以显式地表示这一点,但通常不建议这样做,因为它们是非标准的。


3
永远不要使用 *64 函数。请始终使用选项 -D_FILE_OFFSET_BITS=64 编译所有程序。 - R.. GitHub STOP HELPING ICE
大多数人都同意,因为*64函数不可移植,并且在任何标准中都没有明确定义,但它们确实使要求明确化,在某些有限的情况下可能是有益的。 - mctylr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接