22

我有一个简短的 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 结构或其他原因,是否存在内部限制?

谢谢。

4

2 回答 2

28

在 32 位系统上(即操作系统为 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 的文件。

于 2009-04-08T16:16:41.950 回答
12

当文件达到 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 <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使其明确,并根据使用情况可能是最好的方法。但一般不推荐,因为它们是非标准的。

于 2009-04-08T23:26:08.407 回答