كيفية فتح العديد من الملفات في وقت واحد للقراءة في ج

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

  •  23-09-2019
  •  | 
  •  

سؤال

أحاول نقل بعض كود C ++ الخاص بي في C. لدي البناء التالي

class reader{
private:
FILE *fp;
alot_of_data data;//updated by read_until() method
public:
  reader(const char*filename)
  read_until(some conditional dependent on the contents of the file, and the arg supplied)
}

أنا بعد ذلك إنشاء مئات من هذه الكائنات وتكرارها باستخدام العديد من "read_until ()" لكل ملف حتى يكون allfiles في EOF.

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

ولكن هذا يبدو فوضويًا للغاية ، هل يمكنني تنفيذ وظائف صفي كمؤشر وظيفة ، أو أي شيء أفضل ، أعتقد أنني أفتقد نمط تصميم أساسي؟

الملفات هي وسيلة إلى حد كبير في الذاكرة ، لذا فإن قراءة كل شيء من كل ملف غير ممكن شكر

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

المحلول

يمكنك إنشاء نوع بيانات مجردة:

typedef struct {
  FILE *fp;
  alot_of_data data;//updated by read_until() method
} reader;

void init_reader(reader* that, const char* filename);
void read_until(reader* that, some conditional dependent on the contents of the file, and the arg supplied)

بعد ذلك ، يمكنك إنشاء واستخدام كائنات من هذا النوع كما هو الحال مع كائنات الفصل ، باستثناء ذلك ، بدلاً من obj.func(), ، انت تكتب func(&obj):

reader r;
init_reader(&r, "blah.txt");
read_until(&r, /* ... */);

نصائح أخرى

أسهل طريقة هي فقط تحويل البيانات إلى بنية:

struct reader
{
  FILE *file;
  alot_of_data data;
};

ثم تحديد الوظائف العادية ، التي تأخذ struct reader كحجة الأولى:

int reader_construct(struct reader *r, const char *filename)
{
  if((r->file = fopen(filename, "rt")) == NULL)
    return 0;
  /* do other inits */
  return 1;
}

وتصبح وظيفة القارئ:

int read_until(struct reader *r, arguments)
{
  /* lots of interesting code */
}

ثم فقط لديك مجموعة من الهياكل ، اتصل reader_construct() عليهم ثم افعل read_until() المكالمات كما هو مطلوب.

يمكنك بالطبع اختيار مُنشئ أكثر ديناميكية ، يعيد "الكائن":

struct reader * reader_new(const char *filename)
{
  struct reader *r = malloc(sizeof *r);
  if(r == NULL)
    return NULL;
  if(reader_construct(r, filename))
    return r;
  return NULL;
}

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

// reader.h
typedef struct reader reader;

reader* new_reader(const char*filename);
void read_until(reader*, ...);

// reader.c

struct reader {
    FILE *fp;
    alot_of_data data;//updated by read_until() method
};

reader *new_reader(const char*filename) { ... }
void read_until(reader*, ...) { ... }

يمكنك دائمًا إنشاء بنية للاحتفاظ بجميع المعلومات ذات الصلة ، ثم حلقة على ذلك ... مجرد فكرة ... (أعتقد أن C يدعم الهياكل - لقد مر بعض الوقت ...)

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