[問題] 比對兩個檔案

看板C_and_CPP (C/C++)作者 (Reversi)時間15年前 (2010/09/22 22:33), 編輯推噓3(3015)
留言18則, 5人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 比對兩個檔案,將沒有重複的部分挑出。 比方說 A檔案為 11111 B檔案為 11111 22222 33333 33333 44444 44444 55555 挑出A檔案中的22222 到檔案C B檔案中的55555 到檔案D 原本打算用大致上像下面的寫法 /****** 比對A檔案有, B檔案沒有 ******/ int bothFlag = 0; Afp = fopen(A檔路徑,"r"); Bfp = fopen(B檔路徑,"r"); OTfp = fopen(輸出檔路徑,"w"); while(fscanf(Afp,"%s",A)!=EOF){ bothFlag = 0; while(fscanf(Bfp,"%s",B)!=EOF){ if( strcmp(A,B) == 0 ){bothFlag = 1;break;} } if( bothFlag == 0 )fprintf(OTfp,"%s",A); } 但是總是無法成功。 程式跑出來的錯誤結果: 無法比對,程式碼無法執行到第二個while迴圈中的fscanf敘述。 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) HP-UX informix ESQL/C 補充說明: 如果有其他方法可以達到同樣效果的,還請各位先進解惑...Orz 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.41.199.145

09/22 22:37, , 1F
可以先把檔案內容存起來嗎? (假如不多的話)
09/22 22:37, 1F

09/22 22:42, , 2F
你的fscanf的參數A是什麼?
09/22 22:42, 2F

09/22 22:42, , 3F
A檔案筆數約有八萬筆,B檔案九萬筆
09/22 22:42, 3F

09/22 22:43, , 4F
要把哪個部份的檔案先存起來呀?
09/22 22:43, 4F

09/22 22:45, , 5F
抱歉沒有寫清楚,是字元陣列
09/22 22:45, 5F

09/22 22:49, , 6F
雖然我注意的不是原PO要解決的 run-time error問題, 但
09/22 22:49, 6F

09/22 22:49, , 7F
程式的效率是可以改善的
09/22 22:49, 7F

09/22 22:59, , 8F
感謝e大,我承認這支程式是土法煉鋼<囧>
09/22 22:59, 8F

09/22 23:18, , 9F
如果真的跑不到第二個讀檔,可先檢查檔案有沒有開.
09/22 23:18, 9F

09/22 23:42, , 10F
既然在unix環境下, 直接用 diff
09/22 23:42, 10F

09/22 23:58, , 11F
土法煉鋼沒什麼不好, 讓它聰明點就可以了 :)
09/22 23:58, 11F

09/23 02:12, , 12F
第二個while前加上 rewind(Bfp) ??
09/23 02:12, 12F

09/23 02:15, , 13F
突然想請教如何變快?我想到的方法是二個檔案先排序
09/23 02:15, 13F

09/23 02:16, , 14F
第二個while再用binary-search方式進行搜尋
09/23 02:16, 14F

09/23 02:26, , 15F
效率應該可以從 n^2 降到 n*lg(n) ??
09/23 02:26, 15F

09/23 08:47, , 16F
IO比純計算慢一大截,可以先減少幾倍的IO,會快一點點
09/23 08:47, 16F

09/23 21:01, , 17F
感謝t大!在第二個while前加上rewind函式就可以得到正確
09/23 21:01, 17F

09/23 21:02, , 18F
的結果了!目前正在朝提升效率的方式改進中
09/23 21:02, 18F
文章代碼(AID): #1CcXEaw1 (C_and_CPP)
文章代碼(AID): #1CcXEaw1 (C_and_CPP)