如何在C中修改二进制文件中Struct的成员变量

问题描述 投票:0回答:1

结构:

typedef struct file {
    char name[20];
    int size;
    int offset;
} file;

二进制文件的结构:

number of files --> 4 bytes
file structs --> 28 bytes each
content of files --> <offset>

我想更新二进制文件中结构中文件的偏移量。这是我的实现:

int writeOffsets(char *archiveFile, file list[]) {
    FILE *binFile;
    int numFiles;
    file index[MAX];

    binFile = fopen(archiveFile, "wb+");

    fwrite(&numFiles, sizeof(numFiles), 1, binFile);
    
    for (int i = 0; i < numFiles; i++) {
        while (fread(index, sizeof(file), 1, binFile) == 1) {
            fseek(binFile, -(sizeof(file)), SEEK_CUR);
            printf("For Offset\n");
            printf("before %d\n", index[i].offset);
            fwrite(list, sizeof(file), 1, binFile);
            printf("after %d\n", index[i].offset);
        }
    }

    fclose(binFile);
    return 0;
    
}

但是,当我查看我的二进制文件时,大部分内容都被删除了。目前我如何到达该位置并修改 offset 成员变量?

c struct file-io io fread
1个回答
0
投票
I'm trying to modify the content of binary file(it contains structs)
I want to delete some structs 



void supprimerLivre(int codeLivre, FILE *fichier)
{
    FILE *tempFichier = fopen("temp.bin", "wb+");
    if (tempFichier == NULL)
    {
        printf("Erreur lors de la création du fichier temporaire.\n");
        return;
    }

    livre l;
    int found = 0;

    while (fread(&l, sizeof(livre), 1, fichier))
    {
        if (l.codelivre != codeLivre) 
        {
            fwrite(&l, sizeof(livre), 1, tempFichier);
        }
        else
        {
            found = 1;
        }
    }

    fclose(fichier);
    fclose(tempFichier);

    if (found==0)
    {
        remove("livres.bin"); 
        rename("temp.bin", "livres.bin");
        printf("Le livre avec le code %d a été supprimé avec succès.\n", codeLivre);
    }
    else
    {
        remove("temp.bin");
        printf("Aucun livre avec le code %d n'a été trouvé.\n", codeLivre);
    }
}

    void supprimerLivre(int codeLivre, FILE *fichier)
    {
        FILE *tempFichier = fopen("temp.bin", "wb+");
        if (tempFichier == NULL)
        {
            printf("Erreur lors de la création du fichier temporaire.\n");
            return;
        }

        livre l;
        int found = 0;

        while (fread(&l, sizeof(livre), 1, fichier))
        {
            if (l.codelivre != codeLivre) 
            {
                fwrite(&l, sizeof(livre), 1, tempFichier);
            }
            else
            {
                found = 1;
            }
        }

        fclose(fichier);
        fclose(tempFichier);

        if (found==0)
        {
            remove("livres.bin"); 
            rename("temp.bin", "livres.bin");
            printf("Le livre avec le code %d a été supprimé avec succès.\n", codeLivre);
        }
        else
        {
            remove("temp.bin");
            printf("Aucun livre avec le code %d n'a été trouvé.\n", codeLivre);
        }
    }
but this function always return an empty file I hope you can help me
© www.soinside.com 2019 - 2024. All rights reserved.