ファイルサイズに2GBの制限Cにfwriteのを使用していますか?
-
06-09-2019 - |
質問
私は、ディスク上に多くのスペースがなくなるまでファイルに書き込む短い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_t
とfopen64
に置き換える、と用途に応じて行くための最善の方法かもしれません。が、彼らは非標準であるため、一般的には推奨されません。