باستخدام وظيفة fread:الحجم المراد قراءته أكبر من المتاح للقراءة

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

  •  13-12-2019
  •  | 
  •  

سؤال

عندي سؤال:

أنا أستخدم fread لقراءة ملف.

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

باستخدام حلقة، قم باستدعاء هذه المكالمة على التوالي، لتجعلني أقرأ ملفي بالكامل.

ماذا سيحدث عندما أقترب من نهاية الملف، ولا أستطيع قراءة "size" * sizeof (Reg)، أو إذا كنت متاحًا فقط لقراءة نصف هذا المقدار، فماذا سيحدث مع المصفوفة A الخاصة بي.وسوف تكتمل؟هل سترجع الدالة خطأ؟

هل تعرف كيف تمت قراءة الملف بواسطة الفريسة؟

إدي1:بالضبط، إذا لم يكن التقسيم دقيقًا، عندما أقرأ حجم الملف الأصغر قليلاً الأخير، سأقرأ الأشياء غير الموجودة في الملف، فأنا أتساءل عن تغيير حجم المتجه الخاص بي إلى مقدار البايتات التي يمكنني قراءتها أو تطويرها ديناميكية أفضل.

هل كانت مفيدة؟

المحلول

فريد إرجاع عدد السجلات التي يقرأها.أي شيء يتجاوز ذلك في المخزن المؤقت الخاص بك قد يكون مشوهًا، فلا تعتمد على تلك البيانات.

يقوم Fread بإرجاع عدد العناصر الكاملة فعليًا ، والتي قد تكون أقل من العد في حالة حدوث خطأ أو إذا تم مواجهة نهاية الملف قبل الوصول إلى العد.

لن تقرأ الوظيفة بعد نهاية الملف:الحدث الأكثر ترجيحًا هو أنك ستحصل على مجموعة من المخازن المؤقتة الكاملة ثم قراءة جزئية (نهائية) للمخزن المؤقت، ما لم يكن حجم الملف مضاعفًا لطول المخزن المؤقت الخاص بك.

يحتاج المنطق الخاص بك إلى استيعاب هذا - يمنحك حجم الملف العدد الإجمالي المتوقع للسجلات لذلك لن يكون من الصعب تجاهل البيانات الزائدة في المخزن المؤقت (بعد النتيجة النهائية fread call) الذي يتوافق مع السجلات غير المهيأة.سيكون عداد "السجلات المتبقية للقراءة" أحد الأساليب.

نصائح أخرى

fread() إرجاع عدد العناصر التي يمكنه قراءتها.لذلك عليك التحقق من القيمة المرجعة لـ fread() لمعرفة عدد العناصر الصالحة في المصفوفة الخاصة بك.

سيُرجع عددًا قصيرًا من العناصر أو صفرًا في حالة حدوث خطأ أو EOF تم التوصل إليه.سيكون عليك استخدامها feof() أوند ferror() في هذه الحالة للتحقق من استيفاء الشرط.

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