关于文件系统:在C中使用fwrite时文件大小限制为2GB?

2GB limit on file size when using fwrite in C?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
#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结构或其他原因,是否存在内部限制?

谢谢。


在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的文件。


it stops when the file reaches 2GB.

Is there an internal limitation, due
to the FILE structure, or something?

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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替换它们可以使它变得很明确,并且并根据使用情况可能是最好的方法。,但通常不建议这样做,因为它们是非标准的。