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

請問使用TMemoryString存取AnsiString的問題

尚未結案
jonesyeah
一般會員


發表:6
回覆:5
積分:2
註冊:2004-10-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-02 16:50:52 IP:59.104.xxx.xxx 未訂閱
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString a="Good"; TMemoryStream *ms=new TMemoryStream; ms->Position=0; //ms->Write(a.c_str(),a.Length()); //ms->Write(&a,sizeof(a)); ms->SaveToFile("1"); delete ms; } void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString a; TMemoryStream *ms=new TMemoryStream; ms->Position=0; ms->LoadFromFile("1"); //ms->Read(a.c_str(),a.Length()); //ms->Read(&a,sizeof(a)); Edit1->Text=a; delete ms; } 就是在使用TMemoryStream存取AnsiString時 該用註解掉的哪一種 還有讀回來時,因為新宣告的AnsiString的length是零 所以再讀出AnsiString的大小時,會有問題 是不是需要另外存一個剛開始a的大小 讀檔時也先讀進來 然後再寫進去,之後再加上"\0"呢? 那這個方法會不會去寫到其他的資料呢?
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-02 18:01:16 IP:210.243.xxx.xxx 未訂閱
其實你說的方法都可以, 不過要注意幾點 1. AnsiString的第0個位元是不可存取的, AnsiString用第0個位元來存放字串長度資訊所以使用時要從第一個字元開始(a[1]). 2. AnsiString在宣告後若沒有指定值, 他其實是不會分配記憶體空間的, 所以要用AnsiString的SetLength()來設定記憶體空間大小    幫你修改了一下, 程式碼如下
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString a = "Good";
  TMemoryStream *ms = new TMemoryStream;
  ms->Position = 0;
  ms->Write(a.c_str(),a.Length());
  ms->SaveToFile("c:\\1.txt");
  delete ms;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  AnsiString a = "Good";
  TMemoryStream *ms = new TMemoryStream;
  ms->Position = 0;
  ms->Write(&a[1],sizeof(a));
  ms->SaveToFile("c:\\2.txt");
  delete ms;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  AnsiString a;
  TMemoryStream *ms = new TMemoryStream;
  ms->Position = 0;
  ms->LoadFromFile("c:\\1.txt");
  a.SetLength(ms->Size);
  ms->Read(a.c_str(), ms->Size);
  Edit1->Text=a;
  delete ms;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  AnsiString a;
  TMemoryStream *ms = new TMemoryStream;
  ms->Position = 0;
  ms->LoadFromFile("c:\\1.txt");
  a.SetLength(ms->Size);
  ms->Read(&a[1],sizeof(a));
  Edit1->Text=a;
  delete ms;
}
jonesyeah
一般會員


發表:6
回覆:5
積分:2
註冊:2004-10-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-02 18:17:31 IP:59.104.xxx.xxx 未訂閱
嗯嗯...謝謝..那我懂了.. 那如果我這個ms不只存這個AnsiString的話 後面還有存其他資料的時候 那他的Size不就會出問題了?!
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-02 18:46:39 IP:210.243.xxx.xxx 未訂閱
如果ms後面還存有其它資料用這個方法會把所有資料都讀出來. 不過要注意的是這些資料是否都是字串, 如果有部份不是字串 秀在Edit上可是看不到的. 下面這個例子會把1.txt內的所有資料讀到Memo1上 ---------------------------------------------------------------- 1.txt內容為 Good1 Good2 Good3 Good4 Good5 Good6 Good7 Good8 Good9 ------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) {   AnsiString a;   TMemoryStream *ms = new TMemoryStream;   ms->Position = 0;   ms->LoadFromFile("c:\\1.txt");   a.SetLength(ms->Size);   ms->Read(a.c_str(), ms->Size);   Memo1->Text=a;   delete ms; }
系統時間:2024-04-29 4:37:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!