0

我正在尝试将我的一些 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

4 回答 4

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*, ...) { ... }
于 2010-04-01T10:33:03.730 回答
1

最简单的方法是将数据转换为结构:

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

然后定义普通函数,将 astruct 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;
}
于 2010-04-01T10:33:51.200 回答
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, /* ... */);
于 2010-04-01T10:33:58.813 回答
0

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

于 2010-04-01T10:32:17.127 回答