2010-04-01 76 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) 
} 

进出口然后实例上百个这样的对象,并使用几个“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()'中的双指针'reader **'? – pajton 2010-04-01 10:43:36

+0

我有一个印象'read_until'应该在一堆文件上工作,但重新阅读时看起来不对。我修复了它。 – 2010-04-01 10:46:26

+0

好吧,采取一个数组或读者'也有道理。 – pajton 2010-04-01 10:48:21

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 */ 
} 

然后只需要一个结构数组,就可以调用​​3210,然后根据需要执行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; 
} 
相关问题