如何同时打开多个文件以便在c中阅读

时间:2010-04-01 10:25:57

标签: c++ c object filereader

我正在尝试将一些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 个答案:

答案 0 :(得分: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*, ...) { ... }

答案 1 :(得分: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;
}

答案 2 :(得分: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)

然后你就可以像创建类的对象一样创建和使用这种类型的对象,除了你写{​​{1}}代替obj.func()

func(&obj)

答案 3 :(得分:0)

你总是可以创建一个结构来保存所有相关信息,然后循环...只是一个想法......(我认为C支持结构 - 它已经有一段时间......)