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

請問TMemoryStream的問題

尚未結案
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-03 16:25:52 IP:163.28.xxx.xxx 未訂閱
小弟最近實作常常運用TMemoryStream來讀檔(txt檔)變成AnsiString的格式 但小弟發現,使用TMemoryStream來讀檔一定得用個char array來存他所讀的值,但卻會發生有時在最後會有讀進不該讀的東西(多了一些東西),請問各位高手,怎樣才能正確的使用TMemoryStream來讀檔案(TXT檔),由於我的Txt檔有一些加密的資料,所以不能使用TStringList來讀,會有問題,所以只能用TMemoryStream來讀,但常常會發生問題,小弟就把我的方法提出來,可否給我一個建議?? TMemoryStream *file=new TMemoryStream(); file->LoadFromFile(CurrentDir "\\agent.tmp"); char *buf=new char[file->Size 1]; memset(buf,0x00,file->Size 1); memcpy(buf,file->Memory,file->Size); 有其他比較正確無誤的讀檔方式嗎??
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-03 16:40:31 IP:140.135.xxx.xxx 未訂閱
willchen您好:    之前您的問題,dllee與RaynorPao版主不是已經說明的相當清楚了嗎 < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37777">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37777 而您現在這個問題也很雷同壓< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-03 17:11:19 IP:163.28.xxx.xxx 未訂閱
剛剛我有用上次包子哥給我的方法試過,印出來不是字元型態,也就是我看到的是一堆數字跟英文字的狀態,可以有什麼方法可以正常使用TMemoryStream並且讀出的是使用Char型態??小弟對型態轉換不是很了解
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-03 17:23:24 IP:140.135.xxx.xxx 未訂閱
willchen您好:   引述RaynorPao版主的話
引言: 有沒有用過 UltraEdit 呢?? 試著利用 UltraEdit 把一個純文字文件打開,一開始會看到原始文件的內容 (這就是我說的後者的方式),接著把 UltraEdit的檢視模式轉換到十六進位的模式 (這就是我說的前者的方式),再試試看,你應該就會了解我在說什麼了
請問您試過了嗎< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-03 17:55:47 IP:163.28.xxx.xxx 未訂閱
版主我懂了,但是現在我把它都變成HEX的表示之後,要怎樣才能轉回原本Char型態??
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-03 18:18:08 IP:140.135.xxx.xxx 未訂閱
willchen您好:  我沒有您的加密資料,不過我以下面的範例說明 1.txt的內容為[這裡是Delphi KTOP討論區]
TMemoryStream* ms=new TMemoryStream();
 ms->LoadFromFile("1.txt");
 Memo1->Lines->LoadFromFile("1.txt");
 Byte *data=new Byte [ms->Size];
 ms->Read(data,ms->Size);             //將1.txt內容存到data[]中     TMemoryStream* ms1=new TMemoryStream();
 ms1->Write(data,ms->Size);           //將data[]內容寫入2.txt中
 ms1->SaveToFile("2.txt");
 delete ms;
 delete ms1;
 delete [] data 
下圖是以UltarEdit開啟1.txt的畫面 下圖示以UltarEdit開啟並以16進制編輯1.txt的畫面 而用TMemoryStream讀到的值就為其內容 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-03 18:26:54 IP:163.28.xxx.xxx 未訂閱
多謝版主指教,但我本身檔案是要使用TMemoryStream把他讀到Buffer裡面之後再來做AnsiString的處理,然後最後寫入檔案,請問我要怎麼把他BYTE[i]裡面的資料把他轉換成AnsiString的格式??這點我找半天站上的文章,找不到
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-03 18:50:13 IP:140.135.xxx.xxx 未訂閱
為什麼要轉呢?您看到2.txt的內容了嗎?? 請您再參考一下lcsboy版主的解說 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30852 發表人 - taishyang 於 2003/10/03 18:55:57
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-03 21:19:09 IP:211.74.xxx.xxx 未訂閱
請恕小弟愚昧...我看了版主的文章之後,發現版主的上面的功能只是把檔案讀進Buffer,然後再用另一個TMemoryStream copy然後存檔這樣,那這樣如果當我要更改Buffer裡面的資料時,不是要先把buffer的東西先讀出成AnsiString格式,這樣才能更改不是嗎??那這樣跟使用memcpy的方式有不同嗎??因為小弟有時需要找buffer裡面的某個字元,此時,AnsiString的Pos就很有用,可以再透露一下,如何可以更改讀進buffer的東西,然後在存入,小弟是新手,請多多包函
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-03 21:50:20 IP:140.135.xxx.xxx 未訂閱
willchen您好: 待小弟打完工回實驗室再說明 您可以調整ms->Positon來取得您要的資料 您試試下面的code
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TMemoryStream* ms=new TMemoryStream();
 ms->LoadFromFile("1.txt");
 Memo1->Lines->LoadFromFile("1.txt");
 Byte *data=new Byte [ms->Size];
 ms->Position=4;
 ms->Read(data,ms->Size);     TMemoryStream* ms1=new TMemoryStream();
 ms1->Write(data,ms->Size-4);
 ms1->SaveToFile("2.txt");
 delete ms;
 delete ms1;
 Memo2->Lines->LoadFromFile("2.txt");
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
 TMemoryStream* ms=new TMemoryStream();
 ms->LoadFromFile("1.txt");
 Memo1->Lines->LoadFromFile("1.txt");
 Byte data[2];
 //ms->Position=2;  加上這一行會顯示"裡"
 ms->Read(data,2);     TMemoryStream* ms1=new TMemoryStream();
 ms1->Write(data,2);
 ms1->SaveToFile("2.txt");
 delete ms;
 delete ms1;
 Memo2->Lines->LoadFromFile("2.txt");
}
//---------------------------------------------------------------------------
這樣應該很清楚了吧< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2003/10/03 22:54:44
系統時間:2024-05-18 19:01:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!