看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
LPH66:先讀 然後測 .eof() 是 true 就是沒了 04/01 21:35
rock1985:要用while迴圈包嗎? 因為我要同時要抓兩個檔案的第一行 04/01 21:43
rock1985:我本來想用while(!tmp1.eof() || !tmp2.eof()) 04/01 21:53
rock1985:但是覺得這樣寫不好,還是說用getline? 04/01 21:54
tropical72:while(!tmp1.eof() && !tmp2.eof()) {.....} 04/01 22:05
tropical72:跳出來,再把不到eof的檔案(剩下的都比較大)輸出完 04/01 22:06
loveme00835:個人偏好while(tmp1.good() && tmp2.good()) .. 04/01 22:07
loveme00835:比較直觀, 開檔時也以呼叫用建構子來做, 開不成那整 04/01 22:08
tropical72:推樓上 (個人純粹對C++開讀檔不熟 XD) 04/01 22:08
loveme00835:個物件也廢掉, 還有一點需要注意, 物件如果會被命名 04/01 22:08
loveme00835:成 tempX, 表示他們根本沒有「存在」的必要 04/01 22:09
tjjh89017:如果是這樣寫呢??? http://codepad.org/9qAZjfIN 04/01 22:17
rock1985:謝謝大家的意見 我現在還有一個問題 我剛剛看tjjh大的 04/01 22:37
rock1985:code, 發現因為每一輪都會讀進東西,所以會有東西可能沒 04/01 22:39
rock1985:寫進檔案就被刷掉了, 例如 1.txt 的00064607這一筆 04/01 22:40
tjjh89017:抱歉剛剛沒看到錯誤,應該是這樣才對 04/01 22:45
tjjh89017:http://codepad.org/u6vProzs 04/01 22:45
rock1985:我自己可能沒講清楚 所以我有參考你的修改一下 04/01 22:46
rock1985:實在太感謝你了 04/01 22:46
rock1985:tjjh大 這是我的版本http://codepad.org/WCm7BvZj 04/01 22:48
rock1985:可以幫我看一下嗎 多了比較 在決定下一輪要抓哪一筆 04/01 22:49
tjjh89017:真沒想到會有幫助XDD 04/01 22:49
tjjh89017:Line2的if我想應該放在line12的if裡面,因為有可能會該 04/01 22:55
tjjh89017:資料即為檔案的最後一筆,可能會使的最後一筆資料未輸出 04/01 22:57
rock1985:http://codepad.org/9hOxPgwQ 看你了之後改的 我也改了 04/01 23:10
rock1985:感謝你~~~ 04/01 23:11
tjjh89017:不客氣~~~只是非常驚訝能在這幫上忙~~~XDD 04/01 23:14
rock1985:哈哈 現在再看一個問題 發現最後一筆好像會寫2次到檔案 04/01 23:16
rock1985:發現最後一筆的資料會跑兩次 兩個檔案都一樣 XD 04/01 23:18
rock1985:不過看不太出來是哪邊多跑一次了 04/01 23:29
我現在遇到一個問題 我有很多的檔案要兩兩合在一起 但是我現在程式會掛掉 我覺得可能是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)
tjjh89017:Line 39:list.begin()是不是該改成vlist.begin(),還有 04/02 13:26
tjjh89017:list.end()改成vlist.end() 04/02 13:26