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 ビット システム (つまり、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 を超えるファイルの作成をサポートしています。

于 2009-04-08T16:16:41.950 に答える
12

ファイルが 2GB に達すると停止します。

FILE構造などによる内部制限はありますか?

これは libc (標準 C ライブラリ) によるものです。x86 (IA-32) Linux システムのデフォルトでは、glibc (GNU の C ライブラリ) によって提供される 32 ビット関数です。したがって、デフォルトでは、ファイル ストリーム サイズは 32 ビット (2^(32-1)) に基づいています。

Large File Supportの使用については、Web ページを参照してください。

#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_tそれらをandに置き換えるとfopen64、これが明確になり、使用法によっては最善の方法になる場合があります。しかし、それらは非標準であるため、一般的には推奨されません。

于 2009-04-08T23:26:08.407 に答える