حد 2 جيجابايت على حجم الملف عند استخدام fwrite في ج؟
-
06-09-2019 - |
سؤال
لدي برنامج قصير ج القصير الذي يكتب في ملف حتى لا يكون هناك مساحة أكبر على القرص:
#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)، يتوقف عند الوصول إلى 2 جيجابايت.
هل هناك قيود داخلي، بسبب هيكل الملف، أو شيء من هذا؟
شكرا.
المحلول
على نظام 32 بت (أي نظام التشغيل هو 32 بت)، بشكل افتراضي، تقتصر FOPEN و CO على 32 بت الحجم / الإيقاعات / إلخ ... تحتاج إلى تمكين دعم الملفات الكبيرة، أو استخدام خيار * 64 بت:
http://www.gnu.org/software/libc/manual/html_node/opening-streams.html#index-fopen64-931.
ثم تحتاج FS إلى دعم هذا، ولكن باستثناء الدهون وغيرها من FS البدائية، كلها تدعم إنشاء ملفات> 2 جيجابايت.
نصائح أخرى
توقف عند الوصول إلى الملف 2GB.
هل هناك قيود داخلي، بسبب هيكل الملف، أو شيء من هذا؟
يرجع ذلك إلى LIBC (مكتبة C القياسية)، والتي افتراضيا على نظام Linux Linux X86 (IA-32) هي وظائف 32 بت توفرها Glibc (مكتبة G جنو). لذلك بشكل افتراضي ملف دفق الملف يعتمد على 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
يجعل هذا الصريح، وبالاعتماد على الاستخدام قد يكون أفضل طريقة للذهاب. ولكن لا ينصح بشكل عام لأنها غير قياسية.