檔案內容的快速處理 |
尚未結案
|
DelphiTop
一般會員 發表:4 回覆:4 積分:1 註冊:2004-09-15 發送簡訊給我 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
DelphiTop
一般會員 發表:4 回覆:4 積分:1 註冊:2004-09-15 發送簡訊給我 |
謝謝justdo的解說,不過我的問題是count是累計的但每筆的累加值可能為不規則,譬如說檔案有5000筆資料,而第一筆為count為1,第二筆為5,第三筆為13,第四筆為15...,第2000筆為15000...,第5000筆為8888888,我想快速的從count=1至count=15000將資料取出
1.我是否需要將原檔依次讀取count值並記錄其資料所在筆數,再類似seek方式取得,又該如何設計 2.還是將原檔先存放至記憶體如array等(array要宣告多大),再依次讀取count值並記錄其資料所在index...? 謝謝 ===================引 用 文 章=================== 以binary模式將資料寫到檔案去,則一個int, 三個float 應該會用掉16bytes,若是你的count值是有連續性的,就可以依據count值的差乘上16,就可直接寫入檔案的這個位置;若count不具連續性,則你需要自己另外存一份資料,以便知道該count值所代表的結構物件是第幾個寫入檔案的 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
按照你的使用者自訂格式還是依照Count由小到大的排序將檔案寫入的,使用二分法搜尋(Binary Search)效果應該還是可以接受的!這裡有個Delphi函數參考的寫法,很容易改成BCB。
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=85578 Function BinarySearchRecord(aKey:String):Boolean; var LowerRecord,UpperRecord,MiddleRecord,TotalRecord:integer CustFile : File of Customer; CustData : Customer; Found:Boolean; begin Found := false; try AssignFile(CustFile,'xxx.dat'); Reset(CustFile); TotalRecord := FileSize(CustFile) div sizeof(Custmer); LowerRecord := 0; UpperRecord := TotalRecord; MiddleRecord := ( LowerRecord UpperRecord ) div 2; while ( not Found ) and ( LowerRecord <= UpperRecord) do begin seek(CustFile,sizeof(CustData) * MiddleRecord); BlockRead(CustFile,CustData,sizeof(CustData) ; if ( Edit1.Text = CustData.CustNo ) then begin Found := true; .... break; end else if ( CustData.CustNo < Edit1.Text ) then begin LowerRecord := MiddleRecord 1; ... end else if ( CustData.CustNo > Edit1.Text ) then begin UpperRecord := MiddleRecord - 1; ... end; MiddleRecord := ( LowerRecord UpperRecord ) div 2; end; finally CloseFile(CustFile); end; Result := Found; end; |
jcjroc
高階會員 發表:21 回覆:279 積分:115 註冊:2002-09-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |