2016-11-05 78 views
1

此代码工作读取一个mp3文件ID3V1标签。但我有一个MP3文件很少的目录。我想添加一些内容让我的程序读取目录中的所有MP3文件。 然后我必须将所有ID3V1标签导出为CSV文件。阅读标签为几个MP3文件

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

#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; 

} 
} 
} 

回答

0

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

你应该做的第一件事是列表中的所有目录中的文件,如下图所示How can I get the list of files in a directory using C or C++?

一旦你得到了,你应该通过你的文件循环(这也是以前的链接解释),检查哪些是MP3文件。一个简单的方法来做到这一点(尽管不是最好的)是检查其扩展名,如下所示Getting file extension in C对于每个找到的MP3文件,只需使用您的代码解析它,而不是使用printf将所有内容写入CSV文件。

至于CSV文件,格式很简单,您可以简单地使用fprintffwrite来编写所有内容。如果您打算使用Microsoft Excel读取数据,请不要忘记将sep=,置于文件顶部,否则将无法正确读取它,它已经发生在我身上(它在没有它的情况下在LibreOffice上可以正常工作)

+0

这是工作,但我有一个问题,当我这样做:fprintf(“这是一个例子”) 我的变量“这是一个例子”由于空格分为4种情况,我该如何解决它? – Joys

+0

Mhh否,这不应该发生,如[RFC4180的文档](https://tools.ietf.org/html/rfc4180)在第4页第2页中所述'空间被认为是字段的一部分,不应忽略.'。它还规定,你不能在行末加一个逗号。这意味着如果你运行下面的代码:'fprintf(file,“field1,field2 with spaces,field3 \ n”);'它应该可以正常工作。不要忘记最后的换行符。 – saeleko

+0

同样如我在回答中所说,如果你使用Excel,不要忘记在第一行添加'sep =,',这意味着我的完整示例看起来就是这样'fprintf(file,“sep =,\ nfield1, field2带空格,field3 \ n“);'。 – saeleko