使用fseek()更新二进制文件

时间:2015-12-13 19:33:04

标签: c file binary fwrite fseek

我已经查看并在线查看有效使用fseek()的帮助,但无论我做什么,我仍然没有收到正确的结果。基本上我正在阅读一个有着"年龄"参数。如果年龄是-1,那么在添加到这个二进制文件时,我应该使用fseek()来查找文件中的第一个-1,并用用户输入的新信息覆盖整行。我有一个数组遍历并找到文件开头的所有漏洞,它正常工作。我的问题是它正在更新新动物并将每个动物放入下一个年龄为-1的空槽中,但是当我去刷新我的文件时,所有的动物都被追加到最后,即使它们的身份也是如此。 s是曾经空插槽的id。这是我的代码:

void addingAnimal(FILE *file, struct animal ani, int * availableHoles) {
    int i;
    int offset = ((sizeof(int) + sizeof(ani)) * ani.id -1);
    if (availableHoles[0] != 0) {
        fseek(file, offset, SEEK_SET);
        ani.id = availableHoles[0];
        fwrite & ani, sizeof(ani), 1, file);
        for (i = 0; i < sizeof(availableHoles) -1; i++) {
            availableHoles[i] = avialablesHoles[i+1];
        }
}

文件的最开头有一个整数,告诉我们文件中的孔数,因此偏移量正在删除,所以一旦打印出来,它就会正确打印所有内容。然后我检查我创建的辅助数组中是否有漏洞,如果有,那么我希望动物的id是那个id,我试图找到第一个-1岁的行来放我的在那里更新动物的信息,然后将其写入文件。最后一个for-loop就是我向上移动可用的孔。哦,至于打开文件,我使用r + b进行读写。提前谢谢!

1 个答案:

答案 0 :(得分:2)

您不能使用sizeof(availableHoles)来迭代数组。您所在的函数接收availableHoles作为指针,其大小与孔的数量无关。

将此数组的元素数作为单独的参数传递。

在读/写模式下使用FILE流很棘手,在读模式和写模式下的访问之间是否系统地调用fseek()

发布调用代码时,仅使用addingAnimal函数不足以调查您的问题。