tstream的read方法如何使用? |
答題得分者是:syntax
|
sdfwd
一般會員 發表:1 回覆:3 積分:0 註冊:2005-03-09 發送簡訊給我 |
我寫了一小段代碼如下:
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哪里去了? 真的沒人回答? |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
因為這個問題太簡單了
有人回答後,會顯示你的基礎太差 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 發送簡訊給我 |
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 發送簡訊給我 |
指導不敢當,同時我沒有批評你的意思
我只是單純的指出事實 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 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
這下,算是談到一點設計的觀念
沒有錯,結果就是那樣 不要懷疑,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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |