Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fseek()更新二进制文件_C_File_Binary_Fwrite_Fseek - Fatal编程技术网

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

C 使用fseek()更新二进制文件,c,file,binary,fwrite,fseek,C,File,Binary,Fwrite,Fseek,我一直在网上寻找有效使用fseek()的帮助,但无论我做什么,我仍然没有收到正确的结果。基本上我是从一个有“年龄”参数的动物文件中读取的。如果年龄是-1,那么在添加到此二进制文件时,我应该使用fseek()查找文件中的第一个-1,并使用用户输入的新信息覆盖整行。我有一个数组,它遍历并找到文件开头的所有孔,并且工作正常。我的问题是,它正在更新新的动物,并将每个动物放入下一个年龄为-1的空槽中,但当我去刷新文件时,所有动物都被追加到末尾,即使它们的id是曾经空槽的id。这是我的密码: void ad

我一直在网上寻找有效使用fseek()的帮助,但无论我做什么,我仍然没有收到正确的结果。基本上我是从一个有“年龄”参数的动物文件中读取的。如果年龄是-1,那么在添加到此二进制文件时,我应该使用fseek()查找文件中的第一个-1,并使用用户输入的新信息覆盖整行。我有一个数组,它遍历并找到文件开头的所有孔,并且工作正常。我的问题是,它正在更新新的动物,并将每个动物放入下一个年龄为-1的空槽中,但当我去刷新文件时,所有动物都被追加到末尾,即使它们的id是曾经空槽的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];
        }
}
void addingAnimal(文件*FILE,结构动物ani,int*可用孔){
int i;
int offset=((sizeof(int)+sizeof(ani))*ani.id-1);
如果(可用孔[0]!=0){
fseek(文件、偏移、搜索集);
ani.id=可用孔[0];
fwrite&ani,sizeof(ani),1,文件);
对于(i=0;i

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

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

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

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


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

您是如何打开文件的?您向
fopen()传递了哪些参数
?文件似乎是在追加模式下打开的。好吧,那么,你能做一个吗?
ani.id-1
应该放在括号中吗?对不起,我不知道那是什么。@user3376654单击链接来查找。我相信你指的是我最后的for循环,那只是为了更新空孔。那部分工作正常据我所知,是我在寻找文件的正确行,我遇到了问题。@user3376654不,它工作不正常。如果你不相信这一点,那么在
for
循环中放入一条print语句。你应该发现它没有打印出你希望循环运行的次数。这可能是根本原因,也可能不是根本原因您的问题,但它肯定是错误的,应该加以纠正,以消除这种可能性。