怎么在C语言下生成mp3文件及打开该类型的文件

如何在C语言下生成mp3文件及打开该类型的文件
如何在C语言下生成mp3文件及打开该类型的文件

------解决方案--------------------
【转帖:http://www.my-520.com/viewthread.php?tid=1044】


C语言修改mp3文件中相关信息

先简单介绍一下自己,呵呵,我是职业村长,英文名mikiyo,爱好编程的小菜,希望能多多认识朋友哈,我QQ:848263

大家都知道,要成为一个优秀的黑客,编程的功底是绝对少不了的,只有这样,我们才能从计算机的角度来理解原理,而不是只会用别人的工具活动,但编程的确是一个比较难的活儿,很多小菜估计不是没学过,应该有好多都是学了好久但感到太难而放弃的吧,呵呵。
今天我给大家带来的文章是用C语言来对mp3文件进行部分修改,其中主要涉及到的知识点是文件操作和指针的应用,而这两个恰恰又是C语言最有用的但又最难的知识点,今天我们就用一个简单的例子来使大家能够学到一点东西,高手跳过吧。
废话少说,Let’s Go!

首先,我们应该知道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 ");