我正在读取我的程序中的二进制文件,我的.dat文件中的第一个“东西”是一个整数,它告诉我文件中有多少个洞。基本上我打印动物列表,如果用户决定从列表中删除动物,我将其年龄改为-1并将其添加到我的“洞”中。主要问题是我认为我的计划存在范围问题,但我仍然相当业余。
int * countHoles(FILE *file, struct animal ani, int holesValue) {
int i = 0;
int * availableHoles = malloc(sizeof(int) * 100);
for (i = 0; i < 100; i++) {
availableHoles[i] = 0;
}
while (1) {
fread(&ani, sizeof(ani), 1, file);
if (feof(file)) {
break;
}
if (ani.age < 0) {
availabeHoles[i] = ani.id;
printf("You found one! &d\n", availableHoles[i]);
}
}
for (i = 0; i < holesValues; i++) {
printf("availableHoles: %d\t", availableHoles);
}
return availableHoles;
}
所以我传递的东西是我在main()函数中打开的.dat文件,我拥有的动物结构包含ID,名称,种类,年龄,重量(不是那部分真的很重要),以及我从文件中读取的第一个整数的孔。原始文件以3个孔开头,但当用户删除动物时,洞值将明显更新。在“if(ani.age&lt; 0)”语句中,我的printf()打印年龄为-1的正确ID,但是当我尝试将数组传递回main()时,我只能打印0。起初我虽然问题是我将数组返回到我的main()函数并在那里打印以查看它是否正确传递。过了一会儿,我决定在遍历文件后立即尝试打印孔的ID,我注意到在“for(i = 0; i&lt; holesValue; i ++)”期间,该部分仅打印0' 。我很困惑,因为我不明白在我的if(ani.age&lt; 0)语句中如何“真正”将这些值打到我的availableHoles []数组中。我只是不明白如何解决这个问题。提前谢谢!!
答案 0 :(得分:1)
问题是在你的中间循环(while (1) { ...
)中,你正在使用i
但从未将它设置为任何东西。它进入该循环,其值为100 - 它在前一个循环结束时的内容 - 并且对availableHoles[i]
的所有写入实际上都是availableHoles[100]
(实际上是堆上已分配数组之外的一个位置) )。
我不清楚你要如何填充availableHoles
,但是在进入中间循环并增加i
之前,你应该将0
初始化为i
一次通过循环或每次存储一个新的动物ID。所以:
i = 0;
while (1) {
...
if (ani.age < 0) {
availabeHoles[i++] = ani.id;
printf("You found one! &d\n", availableHoles[i]);
}
}
或
i = 0;
while (1) {
...
if (ani.age < 0) {
availabeHoles[i] = ani.id;
printf("You found one! &d\n", availableHoles[i]);
++i;
}
}