使用TStringList的疑惑? |
答題得分者是:dllee
|
bigdogchina
版主 ![]() ![]() ![]() ![]() ![]() 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
大大们好,我的问题又来了,请您指点我哦
------
人生在勤,不索何获? |
tech_state
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:44 回覆:638 積分:641 註冊:2003-02-10 發送簡訊給我 |
bigdogchina, 您好
以下是Help檔裡的說明。
Call SaveToFile to save the strings in the list to the file specified by FileName. Each string in the list is written to a separate line in the file. 我的想法是0D 0A是SaveToFile這個Methods所寫入的。 =================================
涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。
是非終日有,不聽自然無
天下本無事,庸人自擾之
|
bigdogchina
版主 ![]() ![]() ![]() ![]() ![]() 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
|
collonil
中階會員 ![]() ![]() ![]() 發表:13 回覆:56 積分:63 註冊:2003-03-26 發送簡訊給我 |
引言: tech_state大大,非常感谢您的回答 |
dllee
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
如 tech_state 版主所說,在 SaveToFile() 是將每一行都加入了分行的效果,並沒有去判斷是否是最後一行時,不加入分行效果,如 collonil 所說,每一行一定都會有 0x0D 0x0A,否則您就看不到分行效果了,所以囉,這是必然的結果。
您可以自行繼承 TStringList 並改寫這個 SaveToFile 的 Method,判斷最後一行不用加上 0x0D 0x0A。
另一個方法,直接在存完後,將最後的兩個字去掉就行啦!
如下:
void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *tsl = new TStringList(); AnsiString sTemp = "I Love this KTop"; for(int i = 0; i < 9; i ) { tsl->Add(sTemp); } tsl->SaveToFile("C:\\Test.txt"); delete tsl; TFileStream *stm = new TFileStream("C:\\Test.txt",fmOpenReadWrite); if(stm->Size>=2) stm->Size=stm->Size-2; // 去掉最後一行的 0x0D 0x0A delete stm; }這樣用文字處理器開啟時,就不會多最後一行的空的行。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
bigdogchina
版主 ![]() ![]() ![]() ![]() ![]() 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
collonil大大,谢谢您热情洋溢的回答,您言之有理,在每一行的结尾都有0D 0A,要不然看到的就只有一连穿的字符,最后一行是多了一组0D 0A,您清晰明了的解释让我豁然开朗
------
人生在勤,不索何获? |
dllee
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
看到 Delphi code 不要太緊張,我也是花很長的時間慢慢看才看懂一些些...
procedure TStrings.SaveToFile(const FileName: string); var Stream: TStream; begin Stream := TFileStream.Create(FileName, fmCreate); try SaveToStream(Stream); // 叫用 TStrings 的 SaveToStream finally Stream.Free; end; end; procedure TStrings.SaveToStream(Stream: TStream); var S: string; begin S := GetTextStr; // 取得 TStrings 內的所有文字 Stream.WriteBuffer(Pointer(S)^, Length(S)); // 寫入 Stream end;改 SaveToStream 為 procedure TStrings.SaveToStream(Stream: TStream); var S: string; begin S := GetTextStr; // 取得 TStrings 內的所有文字 if Length(S) >= 2 then Stream.WriteBuffer(Pointer(S)^, Length(S)-2) // 寫入 Stream 少存 2 bytes else Stream.WriteBuffer(Pointer(S)^, Length(S)); // 寫入 Stream end;用 BCB 改寫 .hpp // .hpp class TMyStringList : public TStringList { public: virtual void __fastcall SaveToStream(TStream* Stream); #pragma option push -w-inl inline __fastcall virtual ~TMyStringList(void) { }; inline __fastcall TMyStringList(void) : TStringList() { }; #pragma option pop }; // .cpp void __fastcall TMyStringList::SaveToStream(TStream* Stream) { if(StrLen(GetText())>=2) Stream->WriteBuffer(GetText(), StrLen(GetText())-2); else Stream->WriteBuffer(GetText(), StrLen(GetText())); }沒測試過,參考就好
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |