我正在用 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_END
、SEEK_SET
和 SEEK_CUR
宏在标准 C 的 <stdio.h>
和 POSIX 的 <unistd.h>
中定义。)
关于c - 用 C 提取二进制文件的最后 128 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522473/