請問使用TMemoryString存取AnsiString的問題 |
尚未結案
|
jonesyeah
一般會員 發表:6 回覆:5 積分:2 註冊:2004-10-30 發送簡訊給我 |
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 發送簡訊給我 |
其實你說的方法都可以, 不過要注意幾點
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 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
如果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;
}
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |