使用整数归档数组的范围问题

时间:2015-12-13 02:53:05

标签: c arrays file pointers binary

我正在读取我的程序中的二进制文件,我的.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 []数组中。我只是不明白如何解决这个问题。提前谢谢!!

1 个答案:

答案 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;
    }
}