全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:761
推到 Plurk!
推到 Facebook!

請教一個指標的問題

尚未結案
yangjack
一般會員


發表:3
回覆:3
積分:1
註冊:2004-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-26 22:12:58 IP:220.130.xxx.xxx 未訂閱
目前在操作指標時有一個問題想請各位幫忙. TFileStream* File = new TFileStream(filename,(WORD)fmOpenReadWrite); . . .(略) char *buf=new char[size]; File->ReadBuffer(buf,size); 若要刪除buf中某一些指標中的值要如何刪除呢? 目前已測試 memset(&buf[10],'\0',1); 可是似乎 '\0' == NULL 所以取出buf時 buf[10]之後的值 都不會出現,想請教是否有其他可以只刪除掉buf[x] 而又其餘部份又可以在Memo中顯示出來的方法呢?
Zard
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-26 22:44:18 IP:61.64.xxx.xxx 未訂閱
引言: 目前在操作指標時有一個問題想請各位幫忙. TFileStream* File = new TFileStream(filename,(WORD)fmOpenReadWrite); . . .(略) char *buf=new char[size]; File->ReadBuffer(buf,size); 若要刪除buf中某一些指標中的值要如何刪除呢? 目前已測試 memset(&buf[10],'\0',1); 可是似乎 '\0' == NULL 所以取出buf時 buf[10]之後的值 都不會出現,想請教是否有其他可以只刪除掉buf[x] 而又其餘部份又可以在Memo中顯示出來的方法呢?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char buf[] = "1234567890";
  AnsiString szTmp = buf;
  ShowMessage(szTmp);      // 把buf[2]刪掉
  szTmp.Delete(3, 1);
  ShowMessage(szTmp);
}
yangjack
一般會員


發表:3
回覆:3
積分:1
註冊:2004-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-26 23:13:52 IP:220.130.xxx.xxx 未訂閱
引言:
引言: 目前在操作指標時有一個問題想請各位幫忙. TFileStream* File = new TFileStream(filename,(WORD)fmOpenReadWrite); . . .(略) char *buf=new char[size]; File->ReadBuffer(buf,size); 若要刪除buf中某一些指標中的值要如何刪除呢? 目前已測試 memset(&buf[10],'\0',1); 可是似乎 '\0' == NULL 所以取出buf時 buf[10]之後的值 都不會出現,想請教是否有其他可以只刪除掉buf[x] 而又其餘部份又可以在Memo中顯示出來的方法呢?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char buf[] = "1234567890";
  AnsiString szTmp = buf;
  ShowMessage(szTmp);      // 把buf[2]刪掉
  szTmp.Delete(3, 1);
  ShowMessage(szTmp);
}
感謝您的回應.. 因為目前的檔案過大,所以需要利用指標操作 若直接用String來操作,時間需要較多, 因而想找尋可以刪除某部份指標的方法~
g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-27 03:11:24 IP:61.226.xxx.xxx 未訂閱
yangjack您好: 想要達到您需求那種功能,可能會讓你大失所望,原因在於我們的C語言把'\0'字元視為字串結束符;不過您也不必太過灰心,辦法是人想出來的,以搬移記憶體的方法來實作,同樣可以達到您的需求,以下的程式碼供您做參考:
//字元陣列.
  char buf[] = "1234567890";
    char *p = buf;
    memmove(p 4,p 5,6);//把陣列第五個字元拿掉
    Memo1->Text = p;
//檔案.
    AnsiString FileName = "TEST.TXT";//設檔案內容同為1234567890
    TMemoryStream *ms = new TMemoryStream();
    ms->LoadFromFile(FileName);
    char *p = (char *)ms->Memory;
    memmove(p 4,p 5,5);//把記憶體第五個字元拿掉
    ms->SetSize(9);//重新設定大小
    ms->SaveToFile(FileName);
    delete ms;
其實說穿了,BCB包裝了各種對字串的插入、刪除等方法,一樣透過這方式來達成的.
Zard
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-27 06:44:26 IP:61.64.xxx.xxx 未訂閱
要刪除字串中的某一些字就我所知只能用這種方法了, 如果要自己處理的話, g6101大大也給了你一例子, 但你自己處理不見得比用AnsiString來的快, 你可以試試這兩種方法哪種比較快.
系統時間:2024-06-27 2:51:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!