TWideStrings該怎麼使用? |
尚未結案
|
fbiceo
一般會員 ![]() ![]() 發表:6 回覆:12 積分:3 註冊:2004-08-04 發送簡訊給我 |
|
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
fbiceo
一般會員 ![]() ![]() 發表:6 回覆:12 積分:3 註冊:2004-08-04 發送簡訊給我 |
Hello RedSnow 您好 感謝您再一次替我解惑,想再一次請教 TStringList 可以這樣做 TStringList *test;
test = new TStringList;
test->Add("111");
test->Add("222");
test->Add("333");
test->Add("444");
test->Add("555"); test->SaveToFile("c:\\test.txt"); WideString我使用後並沒有Add()
有一個Attach()不過沒有SaveToFile() 是否有辦法讓WideString 有TStringList 一比一比加入資料後儲存成一個檔案呢? 謝謝你的指導
|
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
fbiceo
一般會員 ![]() ![]() 發表:6 回覆:12 積分:3 註冊:2004-08-04 發送簡訊給我 |
|
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
fbiceo 您好: 真是抱歉,我前一篇回覆得太匆忙,忽略了您要做儲存成檔的動作,因此提供的資訊不足以直接完成您要的動作,我今天查閱了一些資料,發現 BCB 的 Help 似乎對於 WideString 著墨不多,相關範例也大多以 AnsiString 為主,WideString 則大多標明函式格式與參數即予以略過,而上網搜尋的結果也不很樂觀。 這兩天我比較忙一點,不過我仍會繼續試著幫您找一些解決方案,目前的概念大致上是透過 TList 來存取各個 WideString 資料,然後透過 TMemoryStream 之類的物件來讀寫檔案,方向是否正確尚不得知,抽空測試後會有結果,希望其他有經驗的先進們也能提供寶貴意見。 7 天天敲鍵盤 v 時時按滑鼠 8
|
fbiceo
一般會員 ![]() ![]() 發表:6 回覆:12 積分:3 註冊:2004-08-04 發送簡訊給我 |
|
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
fbiceo 您好: 以下是我測試後整理出來的程式敘述,有點克難,但是基本上可以達到您所描述處理 WideString 資料的方式,但不知是否能符合您的全部所需?您參考一下吧:
// **************** 儲存的部份 ********************** // 設定測試用的虛擬資料 wchar_t wfn[14] = {'C', ':', '\\', '\\', 0xF6, 0x20, 0xD6, 0x20, 0xE4, 0x20, 0xFC, 0x0D, 0x0A}; WideString wstr = (WideString)wfn; // 自定設定與比對行尾的符號 (主要是作為拆解資料之用,因此應可設定為其它字元) wchar_t eol[3] = {'\r','\n',0}; // 使用 TList 以便於處理資料 (TList 實際上僅紀錄著資料的指標而已) TList *MySList = new TList; // 可視需要宣告為全域變數 MySList->Add(wstr); // 添加第一筆資料 WideString wstra = (WideString)"333"; wcscat((wchar_t*)wstra, eol); MySList->Add(wstra); // 添加第二筆資料 WideString wstrb = (WideString)"abc"; wcscat((wchar_t*)wstrb, eol); MySList->Add(wstrb); // 添加第三筆資料 WideString wstrc = (WideString)"555"; wcscat((wchar_t*)wstrc, eol); MySList->Add(wstrc); // 添加第四筆資料 // 透過 TMemoryStream 來儲存檔案資料 TMemoryStream* file = new TMemoryStream(); WideString *wstr2; // 轉借做儲存之用的變數 int size; int size2; for (int i = 0; i < MySList->Count ; i ){ wstr2 = (WideString*)MySList->Items[i]; // 取出第 i 個資料 size = wcslen((wchar_t*)wstr2); // 取得字數 size2 = size*sizeof(wchar_t); // 乘以 2 (WideChar 為 2 個字元的寬度) file->Write(wstr2, size2); // 存放到 TMemoryStream 裡 } file->Position = 0; // 將 TMemoryStream 指標指向開頭處 file->SaveToFile("c:\\wstr.bin"); // 將 TMemoryStream 內容儲存到指定的檔案 delete file; delete MySList; 請注意,以下程式不是直接接續上方的敘述,兩段是不同的處理程序 // **************** 讀取的部份 ********************** // 透過 TMemoryStream 來讀取檔案資料 TMemoryStream* file = new TMemoryStream(); file->LoadFromFile("c:\\wstr.bin"); // 將指定檔案的內容載入至 TMemoryStream file->Position = 0; // 將 TMemoryStream 指標指向開頭處 // 使用 TList 處理資料 TList *MySList = new TList; char buff[4] = {0}; // 存放比對資料,以便比對是否為行尾符號? char eol[4] = {0x0D, 0x00, 0x0A, 0x00}; // 行尾的識別符號 (配合儲存時的設定) int size; int oldPostion = 0; // 拆解字串時的字串起始位置 int vPos = 0; // 讀取比對資料時的位置指標 char *wsData; // 如果要在其它地方處理到讀出的資料時,將本宣告改成 "全域" 性宣告 while (file->Position < file->Size){ file->Position = vPos; // 重設指標位置為 "欲讀取比對資料" 的位置 file->ReadBuffer(buff, 4); // 每次讀取 4 個字元 if (strcmp(buff, eol) == 0) { // 如果是行尾識別符號,就進行拆解動作 size = file->Position - oldPostion; // 取得應拆解的字元數量 file->Position = oldPostion; // 將指標重新指向應拆解資料的開頭處 // 必須要有實體位置來存放讀出的資料,但是要考慮對應的 delete 動作 wsData = new char[size]; // 配置足夠空間來存放拆解的資料 file->Read(wsData, size); // 拆解出資料 MySList->Add(wsData); // 將拆解出的資料存放到 List 裡 vPos = file->Position; // 重設指標為下一個 "欲讀取比對資料" 的位置 oldPostion = file->Position; // 記錄下 "下一個應拆解資料" 的開頭處 }else{ vPos = 2; // 指向下一個 "欲讀取比對資料" 的位置 } } // 之後即可使用 MySList->Items[i] 來存取第 i 個資料了 (依此類推), // 下列範例將 List 的所有內容顯示於 Memo 上 // (此處僅做取出動作的驗證示範,不考慮被轉為 AnsiString 後的問題) Memo1->Lines->Clear(); for (int i = 0; i < MySList->Count ; i ){ Memo1->Lines->Add(IntToStr(i) ":" (AnsiString)(wchar_t*)MySList->Items[i]); } // 不再使用 List 時,要記得先釋放掉 List 所對應的實體資料佔用空間 for (int i = 0; i < MySList->Count ; i ){ wsData = (char*)MySList->Items[i]; delete wsData; } delete file; delete MySList;以上程式敘述請依照您的需求,將部份變數的宣告改成 "全域" 性變數,程式片斷也請依這您的需要,自行剪貼組合來使用,同時還得提醒您一下,上述程式可能考慮得不是很全面,如果有問題的話,我們再討論好了。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/11 18:55:59 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |