2016-11-05 81 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