全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1819
推到 Plurk!
推到 Facebook!

檔案內容的快速處理

尚未結案
DelphiTop
一般會員


發表:4
回覆:4
積分:1
註冊:2004-09-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-30 21:23:20 IP:61.230.xxx.xxx 訂閱
1.我利用Timer定期寫入資料於檔案,資料以structure定義如
typedef struct
{
int Count;
float A,B,C;
}Data
其中Count為累加之計數器
2.假設寫入之資料相當多,如何快速的以"Count"為索引值比對其內容,可快速的只處理檔案內某一段資料
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-13 07:29:07 IP:59.105.xxx.xxx 未訂閱
以binary模式將資料寫到檔案去,則一個int, 三個float 應該會用掉16bytes,若是你的count值是有連續性的,就可以依據count值的差乘上16,就可直接寫入檔案的這個位置;若count不具連續性,則你需要自己另外存一份資料,以便知道該count值所代表的結構物件是第幾個寫入檔案的
DelphiTop
一般會員


發表:4
回覆:4
積分:1
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-24 00:25:56 IP:61.230.xxx.xxx 訂閱
謝謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-24 01:59:51 IP:211.22.xxx.xxx 未訂閱
按照你的使用者自訂格式還是依照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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-29 22:05:37 IP:60.248.xxx.xxx 訂閱
std::map
系統時間:2024-03-29 22:06:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!