2010-04-01 4 views
0

Я пытаюсь перенести часть моего кода на C++ в 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) 
} 

Im затем инстанцировании сотни этих объектов и перебирать их с помощью нескольких «read_until()» для каждого файла до тех пор, пока allfiles на EOF.

Я не вижу никакого умного способа сделать это в c, единственным решением, которое я могу придумать, является создание массива указателей FILE и делать то же самое со всеми частными данными члена моего класса.

Но это кажется очень грязным, могу ли я реализовать функциональность моего класса в качестве указателя функции или что-то еще лучше, я думаю, что мне не хватает фундаментального шаблона проектирования?

Файлы путь большой, чтобы иметь все в памяти, поэтому чтение все из каждого файла не представляется возможным Благодаря

ответ

1

Вы создать абстрактный тип данных:

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, /* ... */); 
0

Вы всегда можете создать структуру, чтобы держать всю соответствующую информацию, а затем цикл над этим. .. Просто идея ... (я думаю, что C поддерживает структуры - это было какое-то время ...)

1

Принцип скрытия информации одинаков, независимо от используемого вами языка. Просто переместите материал, который Вы хотите скрыть в исходный файл:

// 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*, ...) { ... } 
+2

Почему двойной указатель 'читатель **' в 'read_until()'? – pajton

+0

У меня было впечатление, что 'read_until' должен был работать с кучей файлов, но при повторном чтении это выглядит неправильно. Я исправил это. –

+0

Хорошо, взяв массив или 'читателей' тоже смысл. – pajton

1

Самый простой способ это просто преобразовать данные в структуры:

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; 
}