C 读取一些MP3文件的标签

C 读取一些MP3文件的标签,c,C,此代码用于读取一个mp3文件ID3V1标签。但是我有一个目录,里面几乎没有MP3文件。我想添加一些东西,允许我的程序读取目录中的所有MP3文件。 然后我必须将所有ID3V1标签导出到CSV文件中 我不知道怎么做,任何帮助都将不胜感激 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char tag[3]; char title[30]; char arti

此代码用于读取一个mp3文件ID3V1标签。但是我有一个目录,里面几乎没有MP3文件。我想添加一些东西,允许我的程序读取目录中的所有MP3文件。 然后我必须将所有ID3V1标签导出到CSV文件中

我不知道怎么做,任何帮助都将不胜感激

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{

char tag[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[30];
unsigned char genre;

}mp3Info;

int main (int argc, char *argv[])
{
if ( argc != 1 )
{
printf( "Please choose one file: %s <song.mp3> \n", argv[0] );
} type FILE,
file = fopen("song.mp3", "rb"); 

if (file == NULL) {

printf("I couldn't open: %s for reading.\n");
exit(0);
}

else
{
mp3Info tag_in;

fseek(file, -sizeof(mp3Info), SEEK_END);

if (fread(&tag_in, sizeof(mp3Info), 1, file) != 1)
{
printf("Could not read the tag\n");
exit (0);
}


if (memcmp(tag_in.tag, "TAG", 3) == 0)
{
printf("Title: %.30s\n", tag_in.title);
printf("Artist: %.30s\n", tag_in.artist);
printf("Album: %.30s\n", tag_in.album);
printf("Year: %.4s\n", tag_in.year);

if (tag_in.comment[28] == '\0')
{
printf("Comment: %.28s\n", tag_in.comment);
printf("Track: %d\n", tag_in.comment[29]);
}

else
{
printf("Comment: %.30s\n", tag_in.comment);
}
printf("Genre: %d\n", tag_in.genre);
}

else
{
fprintf(stderr, "The program has failed to get the Tags\n");
return EXIT_FAILURE;
}

fclose(file);
return 0;

}
}
}
#包括
#包括
#包括
类型定义结构{
char标签[3];
字符标题[30];
炭艺术家[30];
字符相册[30];
焦年[4];
char注释[30];
无符号字符类型;
}mp3Info;
int main(int argc,char*argv[])
{
如果(argc!=1)
{
printf(“请选择一个文件:%s\n”,argv[0]);
}类型文件,
file=fopen(“song.mp3”、“rb”);
if(file==NULL){
printf(“我无法打开:%s进行读取。\n”);
出口(0);
}
其他的
{
mp3Info标记_in;
fseek(文件,-sizeof(mp3Info),SEEK_END);
if(fread(&tag_in,sizeof(mp3Info),1,file)!=1)
{
printf(“无法读取标记\n”);
出口(0);
}
如果(memcmp(tag_in.tag,“tag”,3)=0)
{
printf(“标题:%.30s\n”,标题中的标签);
printf(“艺术家:%.30s\n”,艺术家标签);
printf(“相册:%.30s\n”,相册中的标记);
printf(“年份:%.4s\n”,标记年份);
如果(注释[28]中的标记='\0')
{
printf(“注释:%.28s\n”,注释中的标记);
printf(“曲目:%d\n”,注释[29]中的标记);
}
其他的
{
printf(“注释:%.30s\n”,注释中的标记);
}
printf(“流派:%d\n”,tag_in.Genre);
}
其他的
{
fprintf(stderr,“程序无法获取标记\n”);
返回退出失败;
}
fclose(文件);
返回0;
}
}
}

为了简短起见,我将链接相关的答案,然后您可以结合这些答案来解决您的问题

您应该做的第一件事是列出目录中的所有文件,如下所示

一旦你得到了,你应该循环浏览你的文件(这也在前面的链接中解释),检查哪些是MP3文件。一种简单的方法(虽然不是最好的方法)是检查它的扩展名,如这里所示,对于您找到的每个MP3文件,只需使用您的代码对其进行解析,而不是使用
printf
将所有内容写入CSV文件


至于CSV文件,格式非常简单,您只需使用
fprintf
fwrite
即可写入所有内容。如果您计划使用Microsoft Excel读取数据,请不要忘记将
sep=,
放在文件顶部,否则它将无法正确读取数据,我已经遇到过一次这种情况(在没有它的LibreOffice上可以正常工作)

为了简短起见,我将链接相关答案,然后您可以结合起来解决您的问题

您应该做的第一件事是列出目录中的所有文件,如下所示

一旦你得到了,你应该循环浏览你的文件(这也在前面的链接中解释),检查哪些是MP3文件。一种简单的方法(虽然不是最好的方法)是检查它的扩展名,如这里所示,对于您找到的每个MP3文件,只需使用您的代码对其进行解析,而不是使用
printf
将所有内容写入CSV文件


至于CSV文件,格式非常简单,您只需使用
fprintf
fwrite
即可写入所有内容。如果您计划使用Microsoft Excel读取数据,请不要忘记将
sep=,
放在文件的顶部,否则它将无法正确读取数据,这已经发生在我身上一次了(在没有它的LibreOffice上可以正常工作)

这是可行的,但我在这样做时遇到了一个问题:fprintf(“这是一个示例”)我的变量“这是一个示例”由于空格的原因分为4种情况,我如何修复它?不,这不应该发生,如第2页第4点中所述
空格被视为字段的一部分,不应该被忽略。
。它还声明行的末尾不能有逗号。这意味着如果运行以下代码:
fprintf(文件,“field1,field2,带空格,field3\n”)它应该可以正常工作。不要忘记结尾处的换行符。正如我在回答中所说的,如果使用Excel,不要忘记在第一行添加
sep=,
,这意味着我的完整示例将这样看
fprintf(文件,“sep=,\n字段1,带空格的字段2,字段3\n”)。这是可行的,但我在这样做时遇到了一个问题:fprintf(“这是一个示例”)我的变量“这是一个示例”因空格而分为4种情况,如何修复它?不,这不应该发生,正如第2页第4点
中指定的那样,空格被视为字段的一部分,不应该被忽略。
。它还声明行的末尾不能有逗号。这意味着如果运行以下代码:
fprintf(文件,“field1,field2,带空格,field3\n”)它应该可以正常工作。不要忘记结尾处的换行符。正如我在回答中所说的,如果使用Excel,不要忘记在第一行添加
sep=,
,这意味着我的完整示例将这样看
fprintf(文件,“sep=,\n字段1,带空格的字段2,字段3\n”)