2013-04-12 31 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