♥ 學習筆記Learning 程式語言 Coding

[C++ 程式設計] 學習筆記─讀取檔案與輸入(2/2)

續前言,在Google大神麾下的網友們的知識版圖中,找到了我們要的答案。

imagesGoogle.jpg  

續前言,我們這裡要處理的小問題是這樣的。

Q: 
我總共有三個輸入檔,分為A、B、C,其中A檔案會紀錄B與C檔名的敘述,藉由A檔案的內容得知需要讀取B、C兩檔案與其他的參數。

A:
因此,我們需要讓程式先讀取A檔案。
接著,將A檔案中的字串切成Token。
然後,依序將Token存入預先定義好的暫存Array中。
最後,再透過儲存B、C檔名的Array,呼叫出要讀取的B與C檔案。

 

我們要進入最後一步了,透過對應的暫存字串,再開啟我們所需要的B、C檔案;根據這個討論區的結果。

[已解決]請問C++如何讀多個txt檔 http://www.eyny.com/archiver/tid-5586207.html 

根據這個討論,我們學到幾件事。
(1) 原來ifstream可以宣告成array的形式,因為我之前都幻想他是根水管,其實他也是一種型別而已,既然是水管,多蓋幾個也可以。
(2) 別忘了還有.open()與.close()這兩個函式可以呼叫來用!XD 這兩個函式的用途,顧名思義!

別以為程式設計師都是文謅謅的,其實我們是出了名的暴力,暫時想不到方法解決的問題,先用暴力解決再說!也就是俗稱的「暴力破解法」。(揮拳!!!)

因此,延續前面的程式碼,我們做了以下的些微修改。
我們先不把A考慮進去,宣告ifstream file[3]; 給B、C使用。

 

結果在傳值的時候,發現一個很冏的事,就是型別的問題。
因為我使用的是string,而這個範例使用的是char*,因此我們必須要先做個轉換的動作。
這時,Google大神開示,相關的討論:
c++中string與char*的轉換http://www.lslnet.com/linux/f/docs1/i09/big5150719.htm

這是一個很基本的問題,但是卻也是容易犯的錯。
(像我剛剛就很開心的直接傳一傳啦!馬上被Compiler痛罵了一頓!)

string test=”test”;
const char * temp=test.c_str();
char * temp_2;
strcpy(temp_2,temp);
cout << temp_2 << endl;

從這小段的原始碼,我們可以知道,當test是個string,要將她存入char*型別中的temp時,我們必須使用test.c_str();這個指令;還不能直接使用,必須再給他一個新宣告的char* temp_2的暫存空間,利用strcpy(temp_2,temp);將temp的東西複製過去,才是真正的順利轉換,但是執行起來卻是錯的,為什麼呢?

接著,另有個更詳細的討論,
這樣把string轉換到char*呢?http://www.lslnet.com/linux/f/docs1/i60/big5399451.htm
因此我們知道,c_str()這個東西,轉成的型別是const char*,並且若要複製使用strcpy較好,盡量避免強制轉換以免發生無法預測的狀況。
還有人推薦這樣的寫法。

char cstr1[80];
string str2;
……
strcpy( cstr1, str2.c_str() );

統整一下前面看到的三個討論,並且從這些討論中去思考,怎麼樣修改會變成我們想要的答案呢!?
我們直接補充在之前寫的程式之下,寫寫看將多個檔案同時開啟的方法,因此暫時把相關的宣告都寫在一起。

我們將iftream宣告成了file[3]的陣列,然後將A檔案抓到的字串,使用strcpy複製到一個暫存的變數當中,再利用file.open(filename);的方式將檔案給開啟,為了驗證檔案是否順利開啟,我們重覆了前面的一段if(!infile){cerr << …}的寫法,確認可以順利開啟檔案才刪掉那幾行XDDD。(其實留著也好說,之後找錯比較方便。)
20111005_Input_v3.jpg   

確定B檔案可順利開啟之後,我們直接在複製一份寫出了C,確定可順利執行後,再將程式碼做一點排版囉!(EX: 宣告變數的位置、相似邏輯的合併、階層等) ,方法有很多種,而這種方法是自己在網路上找到的討論,然後自己理解後寫出來的,可以執行後,我們再來想辦法讓他更精簡囉!^^

回到最一開始,這個程式的目的是什麼?
我們希望他可以讀取A檔案,藉由A檔案紀錄的B、C檔名,開啟B、C檔案。

所以,這一部份的工作,就到此告一個段落了!^^
接下來我們要做的是,透過輸入的B、C檔案,建立一個適合我們使用的資料結構。 (待續)

About the author

蕾咪

蕾咪,來自台東,卻不定期旅居歐洲的工程師女孩,身兼作家、部落客、創業家等多重身份。畢業於台大電子所,曾在義大利商與美商擔任研發工程師;走訪世界後,發現對台灣有段割捨不了的愛,讓我們一起努力成為想要的自己吧!:) 合作邀稿請聯繫:ramihaha@gmail.com

Leave a Comment