c语言有关文件操作
发布网友
发布时间:2022-05-03 01:09
我来回答
共3个回答
热心网友
时间:2022-06-28 22:13
最BS楼上__abc这种直接拿到词霸里翻译,看都不看结果就贴上来的人。
==========================
代码部分我在完善中,已经可以顺利读取ID3信息。
基本完工后我会贴到空间里,随后转贴过来。
P.S.15分有点少……
==========================
完成:http://hi.baidu.com/crazycola/blog/item/45e816fd9d7e2b1509244d34.html
完整代码:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAXFILENAME 256
typedef struct tag_id3v1 {
char title[31];
char artist[31];
char album[31];
char year[5];
char comment[31];
char genre;
} TAG_ID3V1;
char* genre_id3v1[] = {
"Blues", "Classic Rock", "Country", "Dance", "Disco", // 00-04 // 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
"Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", // 05-09
"New Age", "Oldies", "Other", "Pop", "R&B", // 10-14
"Rap", "Reggae", "Rock", "Techno", "Instrial", // 15-19
"Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", // 20-24
"Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", // 25-29
"Fusion", "Trance", "Classical", "Instrumental", "Acid", // 30-34
"House", "Game", "Sound Clip", "Gospel", "Noise", // 35-39
"AlternRock", "Bass", "Soul", "Punk", "Space", // 40-44
"Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", // 45-49
"Darkwave", "Techno-Instrial", "Electronic", "Pop-Folk", "Eurodance", // 50-54 // 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
"Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", // 55-59
"Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", // 60-64
"Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", // 65-69
"Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", // 70-74
"Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock" // 75-79
};// 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
void copyinfo( FILE* fp, char* target, int size )
{
char* strtmp = NULL;
int num_read = 0;
strtmp = (char*)malloc((size+1)*sizeof(char));
num_read = fread( strtmp, sizeof(char), size, fp );
strtmp[num_read]='\0';
strcpy( target, strtmp );
free(strtmp); strtmp=NULL;
}
void getID3v1( FILE* fp, TAG_ID3V1* tag )
{
// make sure fp and tag are both correct pointers
copyinfo( fp, tag->title, 30 );
copyinfo( fp, tag->artist, 30 );
copyinfo( fp, tag->album, 30 );
copyinfo( fp, tag->year, 4 );
copyinfo( fp, tag->comment, 30 );
tag->genre = fgetc(fp);
}
void main()
{
char* fname = NULL;
char* strtmp = NULL;
char ext[5] = ".mp3";
FILE* fp = NULL;
// 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
int i, ch, c_yesno = 0;
int num_read = 0;
while( c_yesno != 27 )
{
fname = (char*)malloc(MAXFILENAME*sizeof(char));
do {
system("cls");
printf( "Enter filename: " );
for( i = 0; (i < MAXFILENAME) && ((ch = getchar()) != EOF)
&& (ch != '\n'); i++ )
fname[i] = (char)ch;
fname[i] = '\0';
} while(fname[0]=='\0');
// 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
if( strlen(fname)<5 )
{
printf("Error: filename too short.\n");
free(fname); fname=NULL;
printf("\nPress any key to re-enter... ");
getch(); continue; // exit(-1);
} else {
strtmp = (char*)malloc(5*sizeof(char));
for( i=0; i<4; i++ )
strtmp[i] = fname[strlen(fname)-4+i];
strtmp[i]='\0';
if( stricmp( strtmp, ext ) != 0 )
{ // 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
printf("Error: file may not be a MP3(MPEG Layer-3) file.\n");
free(fname); fname=NULL;
free(strtmp); strtmp=NULL;
printf("\nPress any key to re-enter... ");
getch(); continue; // exit(-2);
} else {
free(strtmp); strtmp=NULL;
if( ( fp = fopen( fname, "rb" ) ) == NULL )
{ // 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
printf("Error: failed to open file: %s\n", fname );
free(fname); fname=NULL;
printf("\nPress any key to re-enter... ");
getch(); continue; // exit(-3);
} else {
fseek( fp, -128, SEEK_END );
strtmp = (char*)malloc(4*sizeof(char));
num_read = fread( strtmp, sizeof(char), 3, fp );
// if fread fails.. do something here
strtmp[num_read]='\0';
if( stricmp( strtmp, "TAG" ) != 0 )
{ // 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
printf("Error: failed to load ID3v1 infomation from file: %s\n", fname );
free(strtmp); strtmp=NULL;
free(fname); fname=NULL;
printf("\nPress any key to re-enter... ");
getch(); continue; // exit(-4);
} else {
TAG_ID3V1 tag;
free(strtmp); strtmp=NULL;
getID3v1( fp, &tag );
free(strtmp); strtmp=NULL;
printf("\nID3v1 Infomation:\n");
printf("Title: %s\n",tag.title);
printf("Artist: %s\n",tag.artist);
printf("Album: %s\n",tag.album);
printf("Year: %s\n",tag.year);
printf("Comment: %s\n",tag.comment);
i=(int)(tag.genre);
printf("Genre: [%d] %s\n",i,(0<i&&i<80)?genre_id3v1[i]:"<Undefined>");
}
// 代码开放,禁止抄袭,转载请注明hi.baidu.com/crazycola原创
free(fname); fname=NULL;
fclose(fp);
} // else( ( fp = fopen( fname, "rb" ) ) == NULL )
} // else( stricmp( strtmp, ext ) != 0 )
} // else( strlen(fname)<5 )
printf("\nEnter again? (ESC or Ctrl+C to abort) ");
c_yesno = getch();
}// while( c_yesno != 27 )
} // main
热心网友
时间:2022-06-28 22:13
在创造了MP3播放器的标准,出现了一个问题,与存储的数据档案。独立的MP3没有什么特别的方法这样做,所以在1996年,李家祥肯普又想出加上一小块的数据传送到音频文件,从而解决了这个问题。该标准被称为id3v1并很快成为标准存储元数据在MP3文件。该id3v1标签中占有128个字节,开始与弦乐标签。标签被放在最后一个MP3文件。
标签,让30个字节为标题,艺术家,专辑, "评论" , 4字节为一年,和一个字节,以确定体裁的歌曲。如果有一个项目,这是不到它的长度, 0是用来填充在空无的立场。
请写信交流语言程序阅读这些信息从一个MP3文件,并打印出来。
1 )使用命令行输入MP3文件名称;
2 )判断文件名的延伸,是" 500 " ;
3 )如果这是一个MP3文件时,法官是否有id3v1信息;
4 )假如它已id3v1信息,打印出所有这些;
样本输入
你可以下载样本MP3档案,从这里。
输出样本
标题:后来
专辑:我等你
时间: 2001
评论:好听的歌
体裁: 13
更多资讯:
以下类型的定义是在id3v1 :
0.blues
1.classic岩
2.country
3.dance
4.disco
5.funk
6.grunge
7.hip跳
8.jazz
9.metal
10.new年龄
11.oldies
12.other
13.pop
14.r及B
15.rap
16.reggae
17.rock
18.techno
19.instrial
20.alternative
21.ska
22.death金属
23.pranks
24.soundtrack
25.euro -技术
26.ambient
27.trip跳
28.vocal
29.jazz +畏缩
30.fusion
31.trance
32.classical
33.instrumental
34.acid
35.house
36.game
37.sound剪辑
38.gospel
39.noise
40.alternrock
41.bass
42.soul
43.punk
44.space
45.meditative
46.instrumental流行
47.instrumental岩
48.ethnic
49.gothic
50.darkwave
51.techno工业
52.electronic
53.pop -民俗
54.eurodance
55.dream
56.southern岩
57.comedy
58.cult
59.gangsta
60.top 40
61.christian说唱
62.pop/funk
63.jungle
64.native美国
65.cabaret
66.new波
67.psychadelic
68.rave
69.showtunes
70.trailer
71.lo -
72.tribal
73.acid朋克
74.acid爵士乐
75.polka
76.retro
77.musical
78.rock &辊
79.hard岩
热心网友
时间:2022-06-28 22:14
这是什么啊 看不懂