我已经查看并在线查看有效使用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进行读写。提前谢谢!
答案 0 :(得分:2)
您不能使用sizeof(availableHoles)
来迭代数组。您所在的函数接收availableHoles
作为指针,其大小与孔的数量无关。
将此数组的元素数作为单独的参数传递。
在读/写模式下使用FILE流很棘手,在读模式和写模式下的访问之间是否系统地调用fseek()
?
发布调用代码时,仅使用addingAnimal
函数不足以调查您的问题。