2013-04-12 30 views
0

我使用minilibX库在C中制作光线跟踪引擎。 我希望能够在一个.conf文件场景的配置,以读取显示:初始化char **的无限数量

例如:

([email protected] 117)cat universe.conf 
#randomcomment 
obj:eye:x:y:z 
light:sun:100 
light:moon:test 

对象的数量可以在1至无限之间变化。 从现在起,我在一个char读取文件,拷贝每行1 1 **选项卡,并通过mallocing对象的数量发现,像这样:

void open_file(int fd, struct s_img *m) 
{ 
    int i; 
    char *s; 
    int curs_obj; 
    int curs_light; 

    i = 0; 
    curs_light = 0; 
    curs_obj = 0; 
    while (s = get_next_line(fd)) 
    { 
     i = i + 1; 
     if (s[0] == 'l') 
     { 
      m->lights[curs_light] = s; 
      curs_light = curs_light + 1; 
     } 
     else if (s[0] == 'o') 
     { 
      m->objs[curs_obj] = s; 
      curs_obj = curs_obj + 1; 
     } 
     else if (s[0] != '#') 
     { 
      show_error(i, s); 
      stop_parsing(m); 
     } 
    } 

现在,我想能够将每个tab[i]的每个信息存储在新的char **tab中,每个对象1个,使用':'作为分隔。 所以我需要初始化和malloc未定数char **tab。我怎样才能做到这一点? (Ps:我希望我的代码和我的英文能够让你理解,而且我只使用基本的函数,比如读,写,打开,malloc ...等等,建立一切,如printf,get_line等)

+0

根据需要分配新空间有什么问题? – atk

+0

我需要为每个新对象分配一个新的char **选项卡。那么,我该怎么做? 有没有办法根据需要声明尽可能多的char **选项卡? – Antoninarto

回答

0

我会用另一种方法(因为这是C,不是C++)和我们去的分配只是大的缓冲区:

char *my_malloc(size_t n) { 
     static size_t space_left = 0; 
     static char *base = NULL; 
     if (base==NULL || space_left < n) base=malloc(space_left=BIG_N); 
     base +=n; return base-n; 
} 

免责声明:我省略了垃圾收集的东西,并测试返回值和各项安全措施,以保持日常短。

另一种思考方式是将文件读入足够大的mallocated数组(可以用ftell检查),扫描缓冲区,用ascii零字符替换分隔符,换行等,并记住起始位置的关键字。

+0

Ftell选项似乎很好,所以... 我要重新编码ftell,然后尝试这个。谢谢! – Antoninarto

+0

你明显知道它是'fseek(fp,0,SEEK_END); sz = ftell(fp);'并且它不可移植。 –

2

您不能分配不确定内存量; malloc不支持它。你可以做的是要分配足够的内存现在和修改以后:

size_t buffer = 10; 
char **tab = malloc(buffer); 

//... 
if (indexOfObjectToCreate > buffer) { 
    buffer *= 2; 
    tab = realloc(tab, buffer); 
} 
+2

对于没有意识到这一点的人:你还必须小心整数溢出。缓冲区的大小是最大的,如果你真正阅读的是“无限”的数据量,那么你最终会用完(认为这在64位系统上比在小型系统上不重要)。 – atk