как открыть много файлов одновременно для чтения в c - PullRequest
0 голосов
/ 01 апреля 2010

Я пытаюсь перенести часть своего кода на 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 () для каждого файла, пока все файлы не будут в eof.

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

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

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

Ответы [ 4 ]

1 голос
/ 01 апреля 2010

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

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, /* ... */);
1 голос
/ 01 апреля 2010

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

// 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*, ...) { ... }
1 голос
/ 01 апреля 2010

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

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;
}
0 голосов
/ 01 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...