كيفية فتح العديد من الملفات في وقت واحد للقراءة في ج
-
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 يدعم الهياكل - لقد مر بعض الوقت ...)