2015-01-12 48 views
0

我工作在C基本命令行的音樂庫,讓你打開通過命令行一個文件的多個普通分隔符的文件,並且像一個藝術家,歌曲名稱,並每年出版添加信息。一旦它退出,它就會將這些信息寫回到同一個文件中。解析使用C

我在試圖找到一個解決方案,以正確地解析文本文件的問題。

例如,輸入文件將是這個樣子:

Title: Heirloom, Artist: Basenji, Year Published: 2014 
Title: With Me, Artist: Cashmere Cat, Year Published: 2014 

我工作的指定項目(針對常見的做法),我們一行信息存儲在一個struct Song看起來像這樣:

struct Song { 
    char title[250]; 
    char artist[250]; 
    int year_published; 
}; 

每個Song存儲在struct Song類型的數組,稱爲music_lib[]

我知道該怎麼做每一行分成一個特定struct Song

while(fscanf(input_file, "%s %s %ld", *temp_title, *temp_artist, *temp_year) != EOF) 
    copy_song_to_music_library(temp_title, temp_artist, temp_year); 

什麼我不知道該怎麼做的是如何正確地分析文本文件,這樣當我有一個已知的格式:

Title: Heirloom, Artist: Basenji, Year Published: 2014

對於我的頭銜變量,我得到的「傳家寶」(和標題:被剝離出來),我的藝術家變量,我得到「尋租basenji」(與藝術家:剝離出來),和我年份變量我得到2014年(與年份publis hed:剝離出來)。

有沒有簡單的方法來做到這一點?

+1

你試過'「標題:%s,藝術家:%s,發表年份:%ld」'? – tumdum

+0

@TomaszKłak'「標題:%s,...'不適用於像」With Me「這樣的空間的標題 – chux

回答

4

您需要更改

while(fscanf(input_file, "%s %s %ld", *temp_title, *temp_artist, *temp_year) != EOF) 

while(fscanf(input_file, "Title: %s, Artist: %s, Year Published: %ld", *temp_title, *temp_artist, *temp_year) != EOF) 

此外,您還需要檢查的fscanf()的返回值,以確保正確的閱讀。

man pagefscanf()

。 。 。返回成功匹配和分配的輸入項目數量,可能少於規定數量,甚至在發生早期匹配失敗時甚至爲零。

一些相關的參考:

這(和家庭)的簽名功能是

int fscanf(FILE *stream, const char *format, ...); 

其中,const char *format被描述爲

格式串由一系列指令組成e如何處理輸入字符的序列。

format預期格式爲[重點礦山]

甲指令是下列之一:

•的空白字符(空格,製表,換行序列,等等;參見isspace(3))。該指令匹配輸入中的任意數量的空白,包括無。

•一個普通字符(即非空格或'%')。該字符必須與輸入的下一個字符完全匹配。

•轉換規範,以'%'(百分號)字符開始。輸入中的字符序列根據此規範進行轉換,結果放置在相應的指針參數中。如果下一個輸入項與轉換規格不匹配,則轉換失敗 - 這是匹配失敗。

注:

然而,使其更廣義的,我會建議使用fgets()採取輸入,然後使用strtok()來標記輸入和使用。

+0

@Gopi這一次,下一次你做。:-) –

+0

感謝!我會檢查出fgets()以及:) – Alex

+0

@Alex您非常歡迎。:-) –