c - 用 C 提取二进制文件的最后 128 个字节

标签 c struct io 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;
}

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

最佳答案

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

因此:

fseek(fp, -128L, SEEK_END);
lseek(fd, -128L, SEEK_END);

(有趣的是,SEEK_ENDSEEK_SETSEEK_CUR 宏在标准 C 的 <stdio.h> 和 POSIX 的 <unistd.h> 中定义。)

关于c - 用 C 提取二进制文件的最后 128 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522473/

相关文章:

c++ - 将消息解析为结构

java.io.IOException : No space left on device Android 异常

c - 为什么案例 : always requires constant expression while if() doesn't?

c - 如何打印出结构体的成员,奇怪的错误?

在 LLDB session 期间使用 expr 调用函数

c - 如何创建 const 结构数组

c++ - 在吃 EOF 后重用 std::cin

java - Netty真的只为网络提供非阻塞IO吗?

C unicode 到 ascii

C中指针的混淆