حد 2 جيجابايت على حجم الملف عند استخدام fwrite في ج؟

StackOverflow https://stackoverflow.com/questions/730709

  •  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 يجعل هذا الصريح، وبالاعتماد على الاستخدام قد يكون أفضل طريقة للذهاب. ولكن لا ينصح بشكل عام لأنها غير قياسية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top