fopenとか、似非OOスタイルとか
試してみた。
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> typedef struct fc { int length; int line_count; int byte; char *filename; char **lineList; } FileClass; char *getLine(FileClass *fp) { return *(fp->lineList + ((fp->line_count)++)); } int getByte(FileClass *fp) { return fp->byte; } int getLength(FileClass *fp) { return fp->length; } char **__fp_to_str_list(FileClass *fp, FILE *ff) { char c, tmp_str[64], **linelist; int i, j; i = j = 0; linelist = (char **)malloc(sizeof(char *)); while((c = getc(ff)) != EOF) { switch (c) { case '\n': tmp_str[j] = '\0'; *(linelist + i) = (char *)malloc(64); assert(*(linelist + i) != NULL); strcpy(*(linelist + i), tmp_str); linelist = (char **)realloc(linelist, (++i + 1) * sizeof(char *)); assert(linelist != NULL); j = 0, fp->length++, fp->byte++; break; default: tmp_str[j++] = c; fp->byte++; break; } } *(linelist + i) = "\0"; return linelist; } void new_FileClass(FileClass *fp, char *filename, char *mode) { FILE *tfp; tfp = fopen(filename, mode); assert(tfp != NULL); fp->filename = filename; fp->length = fp->line_count = fp->byte = 0; fp->lineList = __fp_to_str_list(fp, tfp); } void del_FileClass(FileClass *fp) { char *str; fp->line_count = 0; while((str = getLine(fp)) != "\0") free(str); free(fp->lineList); } int main(int argc, char **argv) { FileClass f_obj; char *str; assert(argc > 1); new_FileClass(&f_obj, *(++argv), "r"); printf("lines: %d\nbytes: %d\n\n", getLength(&f_obj), getByte(&f_obj)); while((str = getLine(&f_obj)) != "\0") printf("%s\n", str); del_FileClass(&f_obj); return 0; }
構造体に関数ポインタを定義しておいて、それこそOOスタイルっ「ぽく」することができることも確認したけど、結局インスタンス(OO風に言えば)の参照渡しをしなくてはならないので、激しくカッコ悪い。恐らく、CLOSの様に書くのがそれっぽいのだろうけど、それ以前に名前空間が分離できないのがなぁ…。だから、カプセル化も多態性もできないし。