2010-04-01 67 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; 
} 
相關問題