我在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"是打印出来的唯一东西吗?
使用fseek()(或者lseek()如果您使用文件描述符而不是文件流),文件末尾带有负偏移量(-128)字节.然后读取128字节的信息.
因此:
fseek(fp, -128L, SEEK_END);
lseek(fd, -128L, SEEK_END);
Run Code Online (Sandbox Code Playgroud)
(有趣的是,SEEK_END,SEEK_SET和SEEK_CUR宏定义在两个<stdio.h>标准C和在<unistd.h>对POSIX).