[問題] 把兩個檔案merge 對vector有些疑問

看板C_and_CPP作者 (疾風)時間14年前 (2011/04/01 21:29), 編輯推噓2(2030)
留言32則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) codeblocks + gcc Release 10.05 gcc 4.4.1 Windows/unicode 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我現在有兩個檔案,我想把他們合成一個, 開完檔案之後一次個別讀一行出來 比較大小,比較小的先寫到檔案裡面,在抓下一行 直到兩個檔案都跑完 餵入的資料(Input): 有三個欄位 第一個欄位是要比較的值 後面兩個欄位之後才會用到這邊不需要特別去比較大小 只要比完第一個欄位,小的先寫進去,遇到一樣大的就先寫第一個檔案讀到的內容 http://ppt.cc/Jvtw http://ppt.cc/5(3L 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> #include <fstream> #include <sstream> using namespace std; int main() { ifstream tmp1, tmp2; string CRC_1,CRC_2; int times_1, times_2, urlnum_1, urlnum;_2 /* open file 0.txt and 1.txt*/ tmp1.open("0.txt"); if(tmp1.fail()) { cout<<"Input file opening failed.\n"; exit(1); } tmp2.open("1.txt"); if(tmp2.fail()) { cout<<"Input file opening failed.\n"; exit(1); } /* 這邊想要一次抓一行或是用 tmp1>>CRC>>times>>urlnum 串接的方式把東西讀進來 我卡在一個地方是 這邊要怎麼在抓東西的時候判斷說這個檔案已經抓完了 假如0.txt比較早抓完,表示之後就不用在比較了 直接把1.txt剩下的部分都寫進去檔案 裡面 */ /* 虛擬碼 if(tmp1沒結束) tmp1>>CRC_1>>times_1>>urlnum_1 if(tmp2沒結束) tmp2>>CRC_2>>times_2>>urlnum_2 if(tmp1>=tmp2) tmp1寫入檔案,抓下一行 else tmp2寫入檔案,抓下一行 repeat直到兩個檔案都跑完 */ /* 實際的程式碼位置 //寫檔案開檔的部分 ostringstream oss; oss.str(""); oss << "./tmp/temp" << i << ".txt"; string s2 = oss.str(); ofstream fo; fo.open(s2.c_str(),ios::out); //卡在這邊怎麼先處理說 檔案0抓一行 檔案1抓一行 之後比較 繼續抓 while(tmp1>>CRC_1>>times_1>>urlnum_1) { cout<<CRC_1<<" "<<times_1<<" "<<urlnum_1<<endl; } if(tmp1 >= tmp2) fo<<CRC_1<<" "<<times_1<<" "<<urlnum_1<<endl; else fo<<CRC_2<<" "<<times_2<<" "<<urlnum_2<<endl; */ return 0; } //程式碼 http://ppt.cc/f-Po 補充說明(Supplement): 現在是想先做兩個檔案的merge 因為之後檔案可能會很大,所以不打算把東西全部讀進來 一次都只抓一行去比較 請大家給我一點意見,怎麼去處理判斷東西抓完的部分給我一點建議 感謝大家 -- 我不是宅 我只是比較居家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 108.21.124.118

04/01 21:35, , 1F
先讀 然後測 .eof() 是 true 就是沒了
04/01 21:35, 1F

04/01 21:43, , 2F
要用while迴圈包嗎? 因為我要同時要抓兩個檔案的第一行
04/01 21:43, 2F

04/01 21:53, , 3F
我本來想用while(!tmp1.eof() || !tmp2.eof())
04/01 21:53, 3F

04/01 21:54, , 4F
但是覺得這樣寫不好,還是說用getline?
04/01 21:54, 4F

04/01 22:05, , 5F
while(!tmp1.eof() && !tmp2.eof()) {.....}
04/01 22:05, 5F

04/01 22:06, , 6F
跳出來,再把不到eof的檔案(剩下的都比較大)輸出完
04/01 22:06, 6F

04/01 22:07, , 7F
個人偏好while(tmp1.good() && tmp2.good()) ..
04/01 22:07, 7F

04/01 22:08, , 8F
比較直觀, 開檔時也以呼叫用建構子來做, 開不成那整
04/01 22:08, 8F

04/01 22:08, , 9F
推樓上 (個人純粹對C++開讀檔不熟 XD)
04/01 22:08, 9F

04/01 22:08, , 10F
個物件也廢掉, 還有一點需要注意, 物件如果會被命名
04/01 22:08, 10F

04/01 22:09, , 11F
成 tempX, 表示他們根本沒有「存在」的必要
04/01 22:09, 11F

04/01 22:17, , 12F
如果是這樣寫呢??? http://codepad.org/9qAZjfIN
04/01 22:17, 12F

04/01 22:37, , 13F
謝謝大家的意見 我現在還有一個問題 我剛剛看tjjh大的
04/01 22:37, 13F

04/01 22:39, , 14F
code, 發現因為每一輪都會讀進東西,所以會有東西可能沒
04/01 22:39, 14F

04/01 22:40, , 15F
寫進檔案就被刷掉了, 例如 1.txt 的00064607這一筆
04/01 22:40, 15F

04/01 22:45, , 16F
抱歉剛剛沒看到錯誤,應該是這樣才對
04/01 22:45, 16F

04/01 22:45, , 17F

04/01 22:46, , 18F
我自己可能沒講清楚 所以我有參考你的修改一下
04/01 22:46, 18F

04/01 22:46, , 19F
實在太感謝你了
04/01 22:46, 19F

04/01 22:48, , 20F
tjjh大 這是我的版本http://codepad.org/WCm7BvZj
04/01 22:48, 20F

04/01 22:49, , 21F
可以幫我看一下嗎 多了比較 在決定下一輪要抓哪一筆
04/01 22:49, 21F

04/01 22:49, , 22F
真沒想到會有幫助XDD
04/01 22:49, 22F

04/01 22:55, , 23F
Line2的if我想應該放在line12的if裡面,因為有可能會該
04/01 22:55, 23F

04/01 22:57, , 24F
資料即為檔案的最後一筆,可能會使的最後一筆資料未輸出
04/01 22:57, 24F

04/01 23:10, , 25F
http://codepad.org/9hOxPgwQ 看你了之後改的 我也改了
04/01 23:10, 25F

04/01 23:11, , 26F
感謝你~~~
04/01 23:11, 26F

04/01 23:14, , 27F
不客氣~~~只是非常驚訝能在這幫上忙~~~XDD
04/01 23:14, 27F

04/01 23:16, , 28F
哈哈 現在再看一個問題 發現最後一筆好像會寫2次到檔案
04/01 23:16, 28F

04/01 23:18, , 29F
發現最後一筆的資料會跑兩次 兩個檔案都一樣 XD
04/01 23:18, 29F

04/01 23:29, , 30F
不過看不太出來是哪邊多跑一次了
04/01 23:29, 30F
我現在遇到一個問題 我有很多的檔案要兩兩合在一起 但是我現在程式會掛掉 我覺得可能是vector的部分有問題 直行到後面就直接掛掉了,所以我看不太出來錯誤訊息 不過我覺得是vector出錯了 我想要把東西兩兩合併 到最後只會剩下一個檔案 不過目前好像有問題 vector不能動態的一直在後面push_back東西進去嗎?? 還是說這邊改用queue 會比較好一點 謝謝大家 http://codepad.org/iTKZ2o7q code http://ppt.cc/beWl list.txt ※ 編輯: rock1985 來自: 108.21.124.118 (04/02 00:26)

04/02 13:26, , 31F
Line 39:list.begin()是不是該改成vlist.begin(),還有
04/02 13:26, 31F

04/02 13:26, , 32F
list.end()改成vlist.end()
04/02 13:26, 32F
文章代碼(AID): #1DbTCSuY (C_and_CPP)