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

在C中使用fwrite时对文件大小的2GB限制?,c,filesystems,fwrite,fat32,C,Filesystems,Fwrite,Fat32,我有一个简短的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);

我有一个简短的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;
}
#包括
内部主(空){
字符c[]=“abcdefghij”;
大小;
文件*f=fopen(“filldisk.dat”、“wb”);
而(1){
rez=fwrite(c,1,sizeof(c),f);
如果(!rez)断裂;
}
fclose(f);
返回0;
}
当我运行程序(在Linux中)时,当文件达到2GB时,程序停止

由于文件结构或其他原因,是否存在内部限制

谢谢。

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

那么您的fs需要支持这一点,但是除了fat和其他基本fs之外,它们都支持创建大于2GB的文件

当文件达到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;
}
定义文件偏移量64位
/*或者更常见的是将-D_FILE_OFFSET_BITS=64添加到CFLAGS*/
#包括
内部主(空){
字符c[]=“abcdefghij”;
大小;
文件*f=fopen(“filldisk.dat”、“wb”);
而(1){
rez=fwrite(c,1,sizeof(c),f);
如果(rez

注意:大多数系统期望fopen(和off_t)基于2^31文件大小限制。将它们替换为
off64\u t
fopen64
可以明确这一点,根据使用情况可能是最好的方法。但一般不推荐使用,因为它们是非标准的。

这听起来像是32位整数的正1/2。硬盘驱动器的格式是哪种文件系统?Linux说的是“vfat”,我认为是FAT32。它是一个4GB闪存驱动器,最初(几乎)是空的。vfat(FAT32)对每个文件有2GB的限制,不管用什么编写代码。XP的FAT文件大小限制为4GB-1B。我原以为Linux的vfat会限制在2GB,但现在读源代码我觉得我错了。永远不要使用*64函数。始终使用
-D\u FILE\u OFFSET\u BITS=64
编译所有程序。大多数人都同意,因为*64函数不可移植,在任何标准中都没有很好的定义,但它们确实明确了要求,这在某些有限的情况下可能是好的。