質問

私は、ディスク上に多くのスペースがなくなるまでファイルに書き込む短い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構造体、または何かに、ありますか?

感謝します。

役に立ちましたか?

解決

デフォルトでは、(OSが32ビットであるIE)、関数fopenと共同/ 32ビットのサイズに制限オフセットされている32ビットシステム上の/ etc ...あなたは大きなファイルのサポートを有効にするか、* 64を使用する必要がありますビットオプションます:

のhttp:// WWW。 gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931する

次に、あなたのfsがこれをサポートする必要がありますが、脂肪や他のプリミティブFSを除いて、それらのすべてが> 2ギガバイトのファイルの作成をサポートします。

他のヒント

  ファイルが2GBに達したときに

それが停止します。

     

内部制限が原因、あります   FILE構造、または何かに?

これは、x86上のデフォルト(IA-32)のLinuxシステムは、glibcの(GNUのCライブラリ)によって提供される32ビットの関数であるlibcの(標準のCライブラリ)に起因するものです。だから、デフォルトでファイルストリームのサイズ 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に置き換える、と用途に応じて行くための最善の方法かもしれません。が、彼らは非標準であるため、一般的には推奨されません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top