首先,我们应该知道mp3文件的格式,这个在百度上应该能找到,我在Google上找到了一篇介绍的比较详细,为了节约篇幅,只截取一段给大家看下吧,我们要修改的是title,作者等信息,这些信息看下mp3文件的格式后会知道他们存在于文件的最后128个字节里,如下所示:
二、MP3标签1(放在文件尾部128字节)
offset type len name
--------------------------------------------
0 char 3 "TAG"
3 char 30 title
33 char 30 artist
63 char 30 album
93 char 4 year
97 char 30 comments
127 byte 1 genre
--------------------------------------------
有了这些就好办多了,这样我们只需把指针移动到“文件大小-128字节”位置处并定义一个结构体就可以操作了,我定义的结构体如下:
struct mp3File
{
char TAG[3];
char title[30];
char artlist[30];
char album[30];
char year[4];
char comments[30];
unsigned char genre[1];
};
最后一个是因为在C语言中没有byte类型,所以我用unsigned char 类型来代替,实际上在本程序中这个没有用处,可以舍去的。
第一步当然是要实现对mp3文件的读取了,我们这里要采用二进制读取的形式,用rb+也就是为读写打开一个二进制文件。
首先我们用fseek函数来将文件指针移动到文件最后的128个字节处,fseek(fp,-128L,2);
然后我们就可以读取了:
printf("下面输出的读取的mp3文件标签内容:\n\n");
fgets(mTestFile.TAG,4,fp);
printf("标签头:");
printf("%s\n",mTestFile.TAG);
后面都是和这个类似的,我们注意到这里的读取内容是4个字节,这是因为系统会自动在最后加上一个’\0’,这时其实我们只读了3个字节内容。
下面就是实现对信息的修改了,这里我们为了简单使用fputs函数而没有使用fwrite,我在这里只是实现一个Demo而已。部分代码如下:
printf("请输入标签头(无特殊情况请仍输入TAG):");
scanf("%s",mTestFile.TAG);
mp3Change=mTestFile.TAG;
fputs(mp3Change,fp);
printf("请输入新的歌曲名:");
fseek(fp,-125,2);
scanf("%s",mTestFile.title);
mp3Change=mTestFile.title;
fputs(mp3Change,fp);
printf("请输入新的作者:");
fseek(fp,-95,2);
scanf("%s",mTestFile.artlist);
mp3Change=mTestFile.artlist;
fputs(mp3Change,fp);
首先我们把要输入的新值保存在一个结构体实例里面,mp3Change是我定义的一个指针char类型的指针,然后用fputs就可以输入到文件中了;
这里我们注意到我每修改一个就会用fseek函数,并且里面数值都在改变,这是因为fputs不像fgets一样能指定字节然后自动移动指针,所以我们必须手动移动。
就用上面的办法修改完后我们可以再用开始的读取方法重新读取一次,看文件中的信息是否已经被改变,这里我们要注意的是要重新移动文件指针使之移动到-128个字节处。
由于这里我们只是实现一个简单的Demo,就没有花太多时间和篇幅,有兴趣的朋友可以完善一下,
地球人都知道读代码才是最好的学习方法啊,呵呵,虽然这里我讲的不多,但我相信我的代码你一定能看得懂,让我们一起努力吧!
完整代码区:
#include <stdio.h>
#include <stdlib.h>
//long int mFileAddress;
struct mp3File
{
char TAG[3];
char title[30];
char artlist[30];
char album[30];
char year[4];
char comments[30];
unsigned char genre[1];
};
void help()
{
printf("使用帮助:\n\n");
printf(" 1,本程序为控制台程序,详细使用方法请看说明文档;\n");
printf(" 2,需要将本程序和你要修改的mp3文件放在同一目录下,并把mp3文件名改为test.mp3");
printf(" 3,由于赶时间,本程序可能有较多BUG,有问题者请与QQ:848263 联系\n\n");
printf("谢谢理解!\n\n");
}
void main()
{
help();
struct mp3File mTestFile;
FILE *fp;
char *mp3Change;
if((fp=fopen("test.mp3","rb+"))==NULL)
{
printf("Read File Error!\n");
exit(0);
}
fseek(fp,-128L,2);
printf("下面输出的读取的mp3文件标签内容:\n\n");
fgets(mTestFile.TAG,4,fp);
printf("标签头:");
printf("%s\n",mTestFile.TAG);
fgets(mTestFile.title,31,fp);
printf("歌曲名:");
printf("%s\n",mTestFile.title);
fgets(mTestFile.artlist,31,fp);
printf("作者:");
printf("%s\n",mTestFile.artlist);
fgets(mTestFile.album,31,fp);
printf("专辑:");
printf("%s\n",mTestFile.album);
fgets(mTestFile.year,5,fp);
printf("年份:");
printf("%s\n",mTestFile.year);
fgets(mTestFile.comments,31,fp);
printf("文件描述:");
printf("%s\n",mTestFile.comments);
printf("\n\n");
printf("下面开始修改mp3文件,请注意备份文件!\n\n");
printf("提醒:1,在修改过程中不要输入空格,请用下划线符号_代替\n");
printf(" 2,输入的新信息应该大于原来的信息量,否则会出错,这是本程序的BUG,敬请原谅.\n\n");
rewind(fp);
fseek(fp,-128L,2);
printf("请输入标签头(无特殊情况请仍输入TAG):");
scanf("%s",mTestFile.TAG);
mp3Change=mTestFile.TAG;
fputs(mp3Change,fp);
printf("请输入新的歌曲名:");
fseek(fp,-125,2);
scanf("%s",mTestFile.title);
mp3Change=mTestFile.title;
fputs(mp3Change,fp);
printf("请输入新的作者:");
fseek(fp,-95,2);
scanf("%s",mTestFile.artlist);
mp3Change=mTestFile.artlist;
fputs(mp3Change,fp);
printf("请输入新的专辑名:");
fseek(fp,-65,2);
scanf("%s",mTestFile.album);
mp3Change=mTestFile.album;
fputs(mp3Change,fp);
printf("请输入新的年份:");
fseek(fp,-35,2);
scanf("%s",mTestFile.year);
mp3Change=mTestFile.year;
fputs(mp3Change,fp);
printf("请输入新的文件描述:");
fseek(fp,-31,2);
scanf("%s",mTestFile.comments);
mp3Change=mTestFile.comments;
fputs(mp3Change,fp);
rewind(fp);
fseek(fp,-128L,2);
/*
mFileAddress=ftell(fp);
printf("%d\n\n",mFileAddress);
*/
printf("\n\n");
printf("以下将输出您修改后的信息\n\n");
fgets(mTestFile.TAG,4,fp);
printf("新标签头:");
printf("%s\n",mTestFile.TAG);
fgets(mTestFile.title,31,fp);
printf("新歌曲名:");
printf("%s\n",mTestFile.title);
fgets(mTestFile.artlist,31,fp);
printf("新作者:");
printf("%s\n",mTestFile.artlist);
fgets(mTestFile.album,31,fp);
printf("新专辑:");
printf("%s\n",mTestFile.album);
fgets(mTestFile.year,5,fp);
printf("新的年份:");
printf("%s\n",mTestFile.year);
fgets(mTestFile.comments,31,fp);
printf("新的文件描述:");
printf("%s\n\n\n",mTestFile.comments);
fclose(fp);
printf("****************************************************************\n\n");
printf(" made by 职业村长\n\n");
printf(" 中国红狼安全小组\n\n");
printf("有问题请联系QQ:848263(职业村长) Email: cunzhang@sina.com\n\n");
printf("****************************************************************\n");
getchar();
getchar();
}
二、MP3标签1(放在文件尾部128字节)
offset type len name
--------------------------------------------
0 char 3 "TAG"
3 char 30 title
33 char 30 artist
63 char 30 album
93 char 4 year
97 char 30 comments
127 byte 1 genre
--------------------------------------------
有了这些就好办多了,这样我们只需把指针移动到“文件大小-128字节”位置处并定义一个结构体就可以操作了,我定义的结构体如下:
struct mp3File
{
char TAG[3];
char title[30];
char artlist[30];
char album[30];
char year[4];
char comments[30];
unsigned char genre[1];
};
最后一个是因为在C语言中没有byte类型,所以我用unsigned char 类型来代替,实际上在本程序中这个没有用处,可以舍去的。
第一步当然是要实现对mp3文件的读取了,我们这里要采用二进制读取的形式,用rb+也就是为读写打开一个二进制文件。
首先我们用fseek函数来将文件指针移动到文件最后的128个字节处,fseek(fp,-128L,2);
然后我们就可以读取了:
printf("下面输出的读取的mp3文件标签内容:\n\n");
fgets(mTestFile.TAG,4,fp);
printf("标签头:");
printf("%s\n",mTestFile.TAG);
后面都是和这个类似的,我们注意到这里的读取内容是4个字节,这是因为系统会自动在最后加上一个’\0’,这时其实我们只读了3个字节内容。
下面就是实现对信息的修改了,这里我们为了简单使用fputs函数而没有使用fwrite,我在这里只是实现一个Demo而已。部分代码如下:
printf("请输入标签头(无特殊情况请仍输入TAG):");
scanf("%s",mTestFile.TAG);
mp3Change=mTestFile.TAG;
fputs(mp3Change,fp);
printf("请输入新的歌曲名:");
fseek(fp,-125,2);
scanf("%s",mTestFile.title);
mp3Change=mTestFile.title;
fputs(mp3Change,fp);
printf("请输入新的作者:");
fseek(fp,-95,2);
scanf("%s",mTestFile.artlist);
mp3Change=mTestFile.artlist;
fputs(mp3Change,fp);
首先我们把要输入的新值保存在一个结构体实例里面,mp3Change是我定义的一个指针char类型的指针,然后用fputs就可以输入到文件中了;
这里我们注意到我每修改一个就会用fseek函数,并且里面数值都在改变,这是因为fputs不像fgets一样能指定字节然后自动移动指针,所以我们必须手动移动。
就用上面的办法修改完后我们可以再用开始的读取方法重新读取一次,看文件中的信息是否已经被改变,这里我们要注意的是要重新移动文件指针使之移动到-128个字节处。
由于这里我们只是实现一个简单的Demo,就没有花太多时间和篇幅,有兴趣的朋友可以完善一下,
地球人都知道读代码才是最好的学习方法啊,呵呵,虽然这里我讲的不多,但我相信我的代码你一定能看得懂,让我们一起努力吧!
完整代码区:
#include <stdio.h>
#include <stdlib.h>
//long int mFileAddress;
struct mp3File
{
char TAG[3];
char title[30];
char artlist[30];
char album[30];
char year[4];
char comments[30];
unsigned char genre[1];
};
void help()
{
printf("使用帮助:\n\n");
printf(" 1,本程序为控制台程序,详细使用方法请看说明文档;\n");
printf(" 2,需要将本程序和你要修改的mp3文件放在同一目录下,并把mp3文件名改为test.mp3");
printf(" 3,由于赶时间,本程序可能有较多BUG,有问题者请与QQ:848263 联系\n\n");
printf("谢谢理解!\n\n");
}
void main()
{
help();
struct mp3File mTestFile;
FILE *fp;
char *mp3Change;
if((fp=fopen("test.mp3","rb+"))==NULL)
{
printf("Read File Error!\n");
exit(0);
}
fseek(fp,-128L,2);
printf("下面输出的读取的mp3文件标签内容:\n\n");
fgets(mTestFile.TAG,4,fp);
printf("标签头:");
printf("%s\n",mTestFile.TAG);
fgets(mTestFile.title,31,fp);
printf("歌曲名:");
printf("%s\n",mTestFile.title);
fgets(mTestFile.artlist,31,fp);
printf("作者:");
printf("%s\n",mTestFile.artlist);
fgets(mTestFile.album,31,fp);
printf("专辑:");
printf("%s\n",mTestFile.album);
fgets(mTestFile.year,5,fp);
printf("年份:");
printf("%s\n",mTestFile.year);
fgets(mTestFile.comments,31,fp);
printf("文件描述:");
printf("%s\n",mTestFile.comments);
printf("\n\n");
printf("下面开始修改mp3文件,请注意备份文件!\n\n");
printf("提醒:1,在修改过程中不要输入空格,请用下划线符号_代替\n");
printf(" 2,输入的新信息应该大于原来的信息量,否则会出错,这是本程序的BUG,敬请原谅.\n\n");
rewind(fp);
fseek(fp,-128L,2);
printf("请输入标签头(无特殊情况请仍输入TAG):");
scanf("%s",mTestFile.TAG);
mp3Change=mTestFile.TAG;
fputs(mp3Change,fp);
printf("请输入新的歌曲名:");
fseek(fp,-125,2);
scanf("%s",mTestFile.title);
mp3Change=mTestFile.title;
fputs(mp3Change,fp);
printf("请输入新的作者:");
fseek(fp,-95,2);
scanf("%s",mTestFile.artlist);
mp3Change=mTestFile.artlist;
fputs(mp3Change,fp);
printf("请输入新的专辑名:");
fseek(fp,-65,2);
scanf("%s",mTestFile.album);
mp3Change=mTestFile.album;
fputs(mp3Change,fp);
printf("请输入新的年份:");
fseek(fp,-35,2);
scanf("%s",mTestFile.year);
mp3Change=mTestFile.year;
fputs(mp3Change,fp);
printf("请输入新的文件描述:");
fseek(fp,-31,2);
scanf("%s",mTestFile.comments);
mp3Change=mTestFile.comments;
fputs(mp3Change,fp);
rewind(fp);
fseek(fp,-128L,2);
/*
mFileAddress=ftell(fp);
printf("%d\n\n",mFileAddress);
*/
printf("\n\n");
printf("以下将输出您修改后的信息\n\n");
fgets(mTestFile.TAG,4,fp);
printf("新标签头:");
printf("%s\n",mTestFile.TAG);
fgets(mTestFile.title,31,fp);
printf("新歌曲名:");
printf("%s\n",mTestFile.title);
fgets(mTestFile.artlist,31,fp);
printf("新作者:");
printf("%s\n",mTestFile.artlist);
fgets(mTestFile.album,31,fp);
printf("新专辑:");
printf("%s\n",mTestFile.album);
fgets(mTestFile.year,5,fp);
printf("新的年份:");
printf("%s\n",mTestFile.year);
fgets(mTestFile.comments,31,fp);
printf("新的文件描述:");
printf("%s\n\n\n",mTestFile.comments);
fclose(fp);
printf("****************************************************************\n\n");
printf(" made by 职业村长\n\n");
printf(" 中国红狼安全小组\n\n");
printf("有问题请联系QQ:848263(职业村长) Email: cunzhang@sina.com\n\n");
printf("****************************************************************\n");
getchar();
getchar();
}