這幾天因?yàn)轫?xiàng)目需要秩铆,寫了個(gè)程序來解析arff文件惕它。先解釋一下什么事arff文件格式吧。Arff文件來源于Weka軟件因块,Weka是一款用于數(shù)據(jù)挖掘的開源分析軟件,而arff是weka指定的存儲(chǔ)數(shù)據(jù)的文件格式籍铁。
Arff文件主要分為頭文件和數(shù)據(jù)兩部分涡上,頭文件部分說明了數(shù)據(jù)包括哪些屬性,以及每一個(gè)屬性的取值范圍等信息拒名。舉個(gè)栗子:比如我們要記錄一個(gè)班里的同學(xué)吩愧,能夠想到會(huì)有Name,Gender靡狞,Height等屬性耻警,于是在arff文件里,能夠看到這樣的信息:
@ATTRIBUTE Name string
@ATTRIBUTE Gender {Male,F(xiàn)emale}
@ATTRIBUTE Height real
可以看出來甘穿,頭文件里每行第一個(gè)關(guān)鍵字@ATTRIBUTE表明這是一個(gè)屬性腮恩,第二個(gè)關(guān)鍵字是屬性的名稱,比如Name温兼,Gender秸滴,Height,第三部分是屬性的取值范圍募判,可能是個(gè)字符串string荡含,可能是枚舉型變量,也可能是個(gè)實(shí)數(shù)届垫。
Arff文件的數(shù)據(jù)部分用@DATA開頭释液,隨后一行代表一個(gè)數(shù)據(jù),緊跟上面的例子装处,數(shù)據(jù)部分會(huì)是這樣的:
@DATA
Lily Female 160
Mitchel Male 175
Jack Male 178
介紹完了Arff文件误债,我的任務(wù)就是寫一個(gè)程序分析arff文件。我的方法是建立一個(gè)arff文件結(jié)構(gòu)體妄迁,里面包括兩種小的結(jié)構(gòu)體:”屬性結(jié)構(gòu)體”和“數(shù)據(jù)結(jié)構(gòu)體”寝蹈,就像這樣:
屬性結(jié)構(gòu)體
struct ArffAttribute
{
char Name[16];
char Candidates[8];
ArffAttribute* Next;
};
數(shù)據(jù)結(jié)構(gòu)體
struct ArffDataLine
{
char classType;
char* dataLine;
ArffDataLine* Next;
};
Arff文件結(jié)構(gòu)體
struct ArffFile
{
ArffAttribute* FirstAttribute;
ArffAttribute* LastAttribute;
ArffAttribute* AttributeList;
ArffDataLine* FirstDataLine;
ArffDataLine* LastDataLine;
ArffDataLine* DataLineList;
int AttributeCount=0;
int DataLineCount=0;
};
ArffFile中用兩種方式存儲(chǔ)屬性,第一種是用FirstAttribute和LastAttribute把屬性按鏈表存儲(chǔ)登淘,第二種是用AttributeList把屬性按照數(shù)組方式存起來箫老。
今天在把屬性鏈表轉(zhuǎn)換成數(shù)組的時(shí)候卡住了,原因是我不清楚這個(gè)數(shù)組的元素應(yīng)該是ArffAttribute黔州,還是ArffAttribute的指針耍鬓。過了一會(huì)才想明白了,由于我是把鏈表元素ArffAttribute保存的內(nèi)容復(fù)制到數(shù)組里辩撑,所以數(shù)組的元素應(yīng)該是ArffAttribute界斜,而不是它的指針。如果我選擇不是復(fù)制內(nèi)容合冀,而是原封不動(dòng)的使用鏈表里本來就有的元素各薇,由于這些元素在內(nèi)存里不能移動(dòng),所以只能用指針指向他們君躺,那么數(shù)組的內(nèi)容就應(yīng)該是指針峭判。
今天寫程序的時(shí)候在這里卡了好一會(huì),在加上別的用指針的地方棕叫,一天里面起碼有40%的時(shí)間用來思考指針的用法林螃,或者調(diào)試指針帶來的錯(cuò)誤,特別消耗時(shí)間俺泣。記得大一的時(shí)候疗认,教材里就寫著指針是個(gè)非常危險(xiǎn)的東西完残,最近一段時(shí)間對(duì)此深有體會(huì),寫程序時(shí)最需要考慮的就是指針的使用横漏,而最容易出錯(cuò)的地方往往也是指針谨设。所以平時(shí)寫程序還是能避免就避免用指針吧~