續前言,在Google大神麾下的網友們的知識版圖中,找到了我們要的答案。
續前言,我們這裡要處理的小問題是這樣的。
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。(其實留著也好說,之後找錯比較方便。)
確定B檔案可順利開啟之後,我們直接在複製一份寫出了C,確定可順利執行後,再將程式碼做一點排版囉!(EX: 宣告變數的位置、相似邏輯的合併、階層等) ,方法有很多種,而這種方法是自己在網路上找到的討論,然後自己理解後寫出來的,可以執行後,我們再來想辦法讓他更精簡囉!^^
回到最一開始,這個程式的目的是什麼?
我們希望他可以讀取A檔案,藉由A檔案紀錄的B、C檔名,開啟B、C檔案。
所以,這一部份的工作,就到此告一個段落了!^^
接下來我們要做的是,透過輸入的B、C檔案,建立一個適合我們使用的資料結構。 (待續)