使用C从二进制文件中删除最后128个字节

dcf*_*rph 2 c io struct id3

我在C中制作一个id3标签编辑器.我无法弄清楚如何从二进制文件末尾拉出最后128个字节,以便操作/打印出id3标签所在的区域.下面是一些代码:

struct Tag{
    char tagMark[3];
    char trackName[30];
    char artistName[30];
    char albumName[30];
    char year[4];
    char comment[30];
    char genre;
};

int main(int argc, char *argv[]){
    struct Tag fileTag;
    FILE *fp;
    fp=fopen(argv[0], "r+b");
    if(!fp){
        printf("ERROR: File does not exist.");
    }

    int bufLength=129;
    fseek(fp, 0, SEEK_END);
    long fileLength=ftell(fp);
    fseek(fp, fileLength-bufLength+1, SEEK_SET);
    fread(&fileTag, sizeof(fileTag), 1, fp);

    printf("%s\n", fileTag.tagMark);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用一个文件来测试它,其中包含一个格式正确的id3标记.在id3标记中,前三个字节分别包含"T","A"和"G",以便识别标记是否存在.有人知道为什么当我运行这个程序时,"_main"是打印出来的唯一东西吗?

Jon*_*ler 5

使用fseek()(或者lseek()如果您使用文件描述符而不是文件流),文件末尾带有负偏移量(-128)字节.然后读取128字节的信息.

因此:

fseek(fp, -128L, SEEK_END);
lseek(fd, -128L, SEEK_END);
Run Code Online (Sandbox Code Playgroud)

(有趣的是,SEEK_END,SEEK_SETSEEK_CUR宏定义在两个<stdio.h>标准C和在<unistd.h>对POSIX).