我正在使用minilibX库在C中制作光线跟踪引擎。
我希望能够在.conf
文件中读取要显示的场景的配置:
例如:
(Az@Az 117)cat universe.conf
#randomcomment
obj:eye:x:y:z
light:sun:100
light:moon:test
对象的数量可以在1和无限之间变化。 从现在开始,我正在读取文件,在char **选项卡中逐行复制每一行,并按找到的对象数量进行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
中,每个对象使用':'
作为分隔。
所以我需要初始化malloc
一个未确定数量的char **tab
。我怎么能这样做?
(Ps:我希望我的代码和我的英语能够让你理解。而且我只使用非常基本的功能,比如读,写,打开,malloc ......我正在重建其他一切,如printf,get_line等)
答案 0 :(得分:2)
您无法分配不确定的内存量; malloc
不支持它。你可以做的是为现在分配足够的内存并稍后进行修改:
size_t buffer = 10;
char **tab = malloc(buffer);
//...
if (indexOfObjectToCreate > buffer) {
buffer *= 2;
tab = realloc(tab, buffer);
}
答案 1 :(得分: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零字符替换分隔符,换行符等,并记住起始位置关键字。