سؤال

أقوم بمشروع مدرسي حول الحفاظ على قاعدة بيانات شخصية. لكن معلمي لم يشرحوا هذه الممارسة ، أوضحوا النظرية (هياكل البيانات وما شابه) وليس كيفية الترميز في ج.

حيث نعطي كمية معينة من الجداول والفهارس والاستشارات التي أرادوا حلها ، ونود أن نبرمج هياكل البيانات التي تعمل وراءها.

اخترت جدول التجزئة للحفاظ على البيانات والأشجار B+للفهارس الثانوية.


حسنًا ، أشجار B+ يمكنني الاحتفاظ بها في ذاكرة الوصول العشوائي ولكن جدول التجزئة الذي يجب أن أكون قادرًا على الحفاظ عليه في القرص الصلب. لذلك أنا أستخدم وظيفة Fwrite () للحفاظ عليها في القرص. لكنني وجدت مشكلة. لا أعرف كيف أكتب الدلو بأكمله في قرص مع تعليمات فردية واحدة (هذا هو أحد المتطلبات القليلة التي أعطيت لها).


الرمز الذي لدي لتهيئة الهيكل

FILE * file;
file = fopen ( "HistoriasClinicas.bin" , "wb" );
for(i=0;i<amountOfBuckets;i++)
    fwrite (Bucket , getpagesize() ,1 , file );
fclose (file);

وهذه هي هياكلي

typedef struct Hist_clin_s{
struct
{
    char codPaciente[7];
} X;
struct
{
    char codMedico[7];
    int fecha;
    char Observacion[151];
} Y;
int ptro;
}Hist_Clin;



typedef struct balde_s{
Hist_Clin *hcs;
char *waste; //Waste to make the bucket reach the page size.
}Bucket;

المشكلة التي أواجهها هي أنه عندما أحاول كتابة دلو. حجم الجرافة هو 8 فقط (cos من المؤشرتين) ولكن لا يمكنني جعل هذين متجهين المؤشرين [] لأنه يجب علي حساب هذه القيم بمجرد بدء البرنامج بالفعل. ولما قرأته ، لا توجد طريقة لتغيير حجم المتجهات ، لأنها تغير المكان في الذاكرة.

الحل الوحيد الذي يمكنني التفكير فيه هو تحميل الدلو بأكمله في صفيف char (نوع من المخزن المؤقت) ثم كتابته إلى الذاكرة.

أيه أفكار؟

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

المحلول

ما تفعله يسمى بشكل عام التسلسل ، إذا كان ذلك يساعدك على مزيد من المعلومات في Google.

الآن ، في هذه الحالة ، بنيتك الأولى:

typedef struct balde_s{
    Hist_Clin *hcs;
    char *waste; //Waste to make the bucket reach the page size.
}Bucket;

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

fwrite( (void*)something.hcs, sizeof(Hist_Clin), 1, file);

التي ستكتب بايت (حجم سجل واحد) ، بدءًا من المؤشر المحدد.

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