線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1241
推到 Plurk!
推到 Facebook!

有關讀取檔案的問題

答題得分者是:william
conchih
一般會員


發表:41
回覆:33
積分:14
註冊:2003-06-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-03 21:21:23 IP:61.230.xxx.xxx 未訂閱
前輩們: 小弟目前要讀取一個檔案的資料,其原先的資料型態是以二進位方式所儲存, 每筆的資料格式為:long(佔4個BYTES) 資料數值依序為920123,34.5,34.5,32.6,32.6,461,920124,30.4,31.7,30.4,31,247…… (此為股票的資料) 程式目的:要讀出此檔案的資料 程式如下: procedure TForm1.Button1Click(Sender: TObject); Var F1:File; Filename,StringTemp:String; OneByte:Byte; i:integer; Begin { Filename:='E:\6232.dat'; AssignFile(F1,FILENAME); Reset(F1,1); StringTemp:=''; for i:=1 to 48 do begin Blockread(F1,OneByte,Sizeof(OneByte)); StringTemp:=StringTemp IntToHex(OneByte,2) ' '; if (i mod 4=0) then StringTemp:=Stringtemp #10; end; Showmessage(StringTemp); CloseFile(F1); end; 有二個問題想要請教 1.有關計算機概論的問題,具有小數點的數值是如何計算出來的 3B 0A 0E 00=59 10*256 14*256*256=920123(正確) 7A 0D 00 00=34.5(為何???????????) BC 0C 00 00=32.6(為何???????????) 2.以前用TurboC時,它有個如下的好方法,可一次將數值讀入一個變數中 fscanf(fp,”%f”,&floatvariable) 如此就不必一個byte一個byte讀取後,再寫程式轉換成10進位數值 因此,以此為出發點,我嘗試將程式改成 1.OneByte:Single //Delphi中沒有Long型態,故找同樣為4Bytes的 2.For迴圈省略,改成 BlockRead(F1,OneByte,SizeOf(OneByte)); Showmessage(FloatToStr(OneByte)); Close(F1); 結果,讀出來的數值不對, 若再改OneByte:Integer及IntToStr(OneByte), 則讀出數值為:為920123,345,345,326,326,461.... 變成原先是小數位的都沒有小數位(因為是整數型態) 我在想可能是Single與原資料型態Long不相同所致, 還是型態中有分Signed與Unsigned二種,小弟不太瞭解 因為我用下面的程式測試沒問題 AssignFile(F2,’E:\Write.dat’); Rewrite(F2,1); ft:=920123; //ft為Single BlockWrite(F2,ft,SizeOf(ft)); Close(F2); AssignFile(F2,’E:\Write.dat’); Reset(F2,1); BlockRead(F2,ft,SizeOf(ft)); Showmessage(FloatToStr(ft)); Close(F2); 結論:請問前輩們,能否告知我的問題點在那,感謝啦 初學者
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-03 22:35:02 IP:61.224.xxx.xxx 未訂閱
如果您的資料都已用 , 逗號分隔了,可以直接利用 TStringList 的 CommaText 來讀取,自動分隔,參考一下以下的 code ,沒有驗證過喔,請自行測試  < class="code"> procedure TForm1.Button1Click(Sender: TObject); var data: TStringList; onedata:TStringList; i: integer; j: integer; begin data := TStringList.Create; onedata := TStringList.Create; data.LoadFromFile('E:\Write.dat'); for i:=0 to data.Count do begin onedata.CommaText=data.Strings[i]; for j:=0 to onedata.Count do begin Showmessage(FloatToStr(onedata.Strings[j])); end; end; onedata.Free; data.Free; end; 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
conchih
一般會員


發表:41
回覆:33
積分:14
註冊:2003-06-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-03 22:45:01 IP:61.230.xxx.xxx 未訂閱
dllee大大,對不起 小弟沒有寫清楚 資料間沒有逗號相隔 但我會試試看是否可以做些修正 還是很感激大大
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-04 09:16:41 IP:147.8.xxx.xxx 未訂閱
1) On Intel CPU:    3B 0A 0E 00 -> $000E0A3B = 920123    7A 0D 00 00 -> $00000D7A = 3450    BC 0C 00 00 -> $00000CbC = 3260 Hence I guess the value is (data)*0.01 for (data)procedure TForm1.Button1Click(Sender: TObject); Var F1:File; Filename,StringTemp:String; OneLong: longint; i:integer; Begin { Filename:='E:\6232.dat'; AssignFile(F1,FILENAME); Reset(F1,1); StringTemp:=''; for i:=1 to 14 do begin Blockread(F1,OneLong,Sizeof(OneLong)); StringTemp:=IntToHex(OnLong,8); end; Showmessage(StringTemp); CloseFile(F1); end; 2) Using filestream should be easier...
conchih
一般會員


發表:41
回覆:33
積分:14
註冊:2003-06-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-04 18:19:53 IP:61.230.xxx.xxx 未訂閱
感謝 William 大大 一語警醒夢中人,原來他的檔案中根本就沒有小數點 因為小弟才剛學,不了大大指的 Filestream 為何 是指用dllee大大指的 TStringList 嗎?還是有其他的函數? 那 BlockRead 不算是 Filestream 嗎 謝謝啦
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-04 18:43:19 IP:61.224.xxx.xxx 未訂閱
引言: dllee大大,對不起 小弟沒有寫清楚 資料間沒有逗號相隔 但我會試試看是否可以做些修正 還是很感激大大
如果資料間沒有逗號相隔,是以空白相隔,可以先將空白變成逗號, 請參考一下 StringReplace() 的線上說明,或本討論區內關於 StringReplace() 的討論。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-05 10:34:57 IP:147.8.xxx.xxx 未訂閱
引言:感謝 William 大大 一語警醒夢中人,原來他的檔案中根本就沒有小數點 因為小弟才剛學,不了大大指的 Filestream 為何 是指用dllee大大指的 TStringList 嗎?還是有其他的函數? 那 BlockRead 不算是 Filestream 嗎 謝謝啦
Using file stream:
procedure TForm1.Button1Click(Sender: TObject);
Var
  F1: TFileStream;
  Filename:String;
  OneLong: longint;
Begin
  Filename := 'E:\6232.dat';
  F1 := TFileStream.Create(Filename,fmOpenRead);
  try
    while not F1.EOF do begin
     if F1.Read(OneLong,Sizeof(OneLong))>0 then
       ShowMessage(IntToHex(OneLong,8));
    end;
  finally
    F1.Free;
  end;
  Showmessage(StringTemp);
end;
系統時間:2024-05-20 2:07:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!