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

tstream的read方法如何使用?

答題得分者是:syntax
sdfwd
一般會員


發表:1
回覆:3
積分:0
註冊:2005-03-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-17 10:22:16 IP:221.215.xxx.xxx 訂閱
我寫了一小段代碼如下:
var
nr:string[10];
begin
nr:='1234567890';
mystream.LoadFromFile('f123.txt');
mystream.Seek(0,sofrombeginning);
mystream.Read(nr,5);
mystream.Position:=0;
memo1.Lines.LoadFromStream(mystream);
edit1.Text:=nr;
end;
假如文本文件'f123.txt'的內容為:“a、在ntfs文件系统中......”,memo1的內容正確,edit1.text顯示的卻是“、在ntfs文”。字母a哪里去了?



真的沒人回答?
編輯記錄
taishyang 重新編輯於 2007-05-17 10:23:35, 註解 無‧
sdfwd 重新編輯於 2007-05-17 10:45:56, 註解 無‧
sdfwd 重新編輯於 2007-05-21 16:39:54, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-25 01:36:48 IP:61.64.xxx.xxx 訂閱
因為這個問題太簡單了
有人回答後,會顯示你的基礎太差

1. String 由 1 開始, mystream.Read(nr,5); 這一行,會由 0 開始寫入,會破壞 String 的結構
顯示你連 String 如何用都不知道
消失的 'a' 在 nr[0],因不會被正確複製,所以
edit1.text沒有 a

2.
「edit1.text顯示的卻是“、在ntfs文”。字母a哪里去了?」 顯示你在睜眼說瞎話
mystream.Read(nr,5); 讀入的是 5 byte 就是兩個中文字加上一個英文 即是 "a、在" ,不可能會看到 "ntfs文" 這幾個字
妳的電腦跟大家的不一樣?還是妳程式亂貼?

解:
mystream.Read(nr[1],5);
sdfwd
一般會員


發表:1
回覆:3
積分:0
註冊:2005-03-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-25 09:47:37 IP:221.215.xxx.xxx 訂閱
syntax大俠教育的是,我是初學,所以基礎很差,我接受您的批評。由于老是得不到正確的結果,代碼屢次修改,以至于最后貼出的代碼有問題。以后我一定注意貼出最真實的結果。但是用您的方法(mystream.Read(nr[1],5);),也不是我希望的結果,nr2多了一個a。代碼是這樣的:(f123.txt的內容為:a分区中每一个文件以及文件夹NTFS都存储一个访问控制列表,访问控制列表包含所有被许可的用户帐户)請您耐心指教。
procedure TForm1.Button1Click(Sender: TObject);
var
nr1,nr2:string[11];
tfile:textfile;
begin
mystream.LoadFromFile('f123.txt');
assignfile(tfile,'f123.txt');
reset(tfile);
read(tfile,nr1);
closefile(tfile);
mystream.Read(nr2[1],11);
mystream.Position:=0;
memo1.Lines.LoadFromStream(mystream);

edit1.Text:=nr1;
label1.Caption:=nr2;

end;
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-25 13:52:16 IP:61.64.xxx.xxx 訂閱
指導不敢當,同時我沒有批評你的意思

我只是單純的指出事實

1. 你需要好好看一本書,Delphi 書很多,挑一本有教基礎語法的看
2. read 與 xxxxStream.Read 的用法相同,都不過是將東西搬到指定 buffer 位置
所以,你要指定開始的位置,String 是在 nr[1] <----- 即,第一個字元的記憶體位址
並指定要搬移的數量,如果是文字,英文一個字 1 byte,中文則佔 2 byte,如果是 Unico... 則又不同
並不會很難理解

你之所以不會,是沒有好好看過一本書,網路上,電子書,多的是,你想要進步,就一定要做好基本工的修練
不然你會永遠困在基本語法、用法的牢籠中

3. 「也不是我希望的結果,nr2多了一個a」,那你要 a 還是不要?(你第一次是問 字母a哪里去了?)
不過這次你貼的程式很清楚
兩個 read 都是讀 11 byte (一個中文佔 2 byte) ,結果都是 "a分區中每一"
Memo 則是全讀
如果你不要 'a' ,那就跳過 1 byte 在開始讀 --->
mystream.Position:=1; ,position 的單位是 byte 不是「一個字」

你自己也說是初學,但初學不是萬用的藉口,Delphi 自帶的 HELP 要多看,如果 HELP 英文看不懂,那,就加強英文吧!

很多人是不想回一些基本的問題,不過看你有貼出程式,才會跟你說你的問題的癥結點在哪 --> 你需要
好好看一本有教基礎語法的書


sdfwd
一般會員


發表:1
回覆:3
積分:0
註冊:2005-03-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-25 14:35:48 IP:221.215.xxx.xxx 訂閱
syntax前輩,是我沒說清楚,label1.caption確實顯示的是“a分區中每一a”。難道真的是我的機器不一樣?在local variable中看到
nr1:'a分區中每一'
nr2:'a分區中每一'#$B'a'#$B7
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-25 21:57:01 IP:61.64.xxx.xxx 訂閱
這下,算是談到一點設計的觀念

沒有錯,結果就是那樣
不要懷疑,nr2 的值確實會隨機的不正確,原因如下

問題就在於,你使用的方式不甚正確
不要使用 String 當作 buffer 後,又將之當成 String 使用,即使讀入的也是 String
(ShortString 可以當作 buffer 使用 ,就跟 array[0..10] of Char 相同,但差異在 ShortString 會有額外處理,所以不要再將之當成 String 來用,一開始當成什麼,就一直用到底)

這裡 read 會幫你修正,是因為剛好檔案型態是使用 textfile,所以編譯器將之當成 String 處理
(如果你宣告的不是 textfile,那 nr1 會有類似的不正確顯示)
而 xxxStream.Read 的則是當成 buffer 處理,來讀資料,在將之當成 String 顯示

這樣 compiler 內部的處理機制會跳過一些本來該修正的欄位,然後再用那些欄位處理資料,就會出錯

簡單的說 String[0] 是記錄長度的,剛開始,數值是隨機的

read 會去改成正確值,
而 xxxStream.Read 卻不會,所以你要自己來 nr2[0] := Char(讀入的長度);

這樣
local variable 與實際顯示都會正確

不過這樣的用法不好

不要混用不同型態的資料處理方式,可以減少自己的麻煩

這個在Delphi developer's guid 一書中有提到,Delphi 的 String 是 life time management,有額外的處理,該書很值得你看

同時String[0] 是記錄長度,但技術規格可能會被更改,所以不可以依賴,不要用最好

所以你最好是用 nr2 : array[0..11] of Char; 如果你是要當成 buffer 來用

但是你也許是想要直接讀入字串,這樣就要用 nr2: String; ,宣告呈動態的

然後用 SetLength(nr2, 11) ,先設定,在讀
mystream.Read(nr2[1],11);,讀入的就直接是可用的字串

這樣跟
nr2[0] := Char(讀入的長度); 的差異只在,將來要是不在[0] 記錄長度,則後者的程式不會受影響,
使用 nr2[0] := Char(讀入的長度); 的程式,就會面臨重新改寫的命運

很多書都強調 「
不要混用不同型態的資料處理方式」,不是只有 Delhpi,C、C 、C# 都是這樣
sdfwd
一般會員


發表:1
回覆:3
積分:0
註冊:2005-03-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-26 12:32:03 IP:221.215.xxx.xxx 訂閱
Syntax前輩,非常感謝您的精確解答。我會認真地讀一下您推薦的書籍。希望有一天能像您一樣,學點東西,幫助他人。鞠躬!
系統時間:2024-11-23 6:01:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!