有關讀取檔案的問題 |
答題得分者是:william
|
conchih
一般會員 發表:41 回覆:33 積分:14 註冊:2003-06-07 發送簡訊給我 |
前輩們: 小弟目前要讀取一個檔案的資料,其原先的資料型態是以二進位方式所儲存,
每筆的資料格式為: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 發送簡訊給我 |
如果您的資料都已用 , 逗號分隔了,可以直接利用 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 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
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)
|
conchih
一般會員 發表:41 回覆:33 積分:14 註冊:2003-06-07 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言:感謝 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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |