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

使用TStringList的疑惑?

答題得分者是:dllee
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-29 18:51:20 IP:211.162.xxx.xxx 未訂閱
大大们好,我的问题又来了,请您指点我哦 在使用 > < class="code"> 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:\\测试.txt"); } delete tsl; } 结果让我大吃一惊,用UltraEdit-32打开测试文本,结果显示有10行内容?第10行还为空?应该只循环了9次的嘛,这第10行是从那里飞来的哦.打开该文本的16进制一看,第10行内容为: 0D 0A 我看了看ASCII码,晓得了0D是跳行字符,0A是重置字符,我就觉得奇怪了,我没有写入这些字符啊,是谁动了我的奶珞???奇怪 人生在勤,不索何获?
------
人生在勤,不索何获?
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-29 19:12:44 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-29 19:25:32 IP:211.162.xxx.xxx 未訂閱
tech_state大大,非常感谢您的回答 现在知道了,原来动我奶珞的是 >) 如果我希望去掉<>>该怎么办呢?有这种可能吗?就是只有
------
人生在勤,不索何获?
collonil
中階會員


發表:13
回覆:56
積分:63
註冊:2003-03-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-29 21:15:58 IP:210.71.xxx.xxx 未訂閱
引言: tech_state大大,非常感谢您的回答 现在知道了,原来动我奶珞的是 >) 如果我希望去掉<>>该怎么办呢?有这种可能吗?就是只有>< face="Verdana, Arial, Helvetica"> 這9行"I Love this KTop"後應該都有0D 0A吧?! "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A "I Love this KTop", 0D, 0A 不然它們就會連成一行, 就變成一個string了... "I Love this KTopI Love this KTopI Love this KTopI Love this KTopI Love this KTopI Love this KTopI Love this KTopI Love this KTopI Love this KTop" 還是說您的情形是最後有兩組0D 0A? "I Love this KTop", 0D, 0A ... "I Love this KTop", 0D, 0A, 0D, 0A -- BCB學習中~~ 發表人 -
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-30 08:53:53 IP:61.224.xxx.xxx 未訂閱
如 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-30 11:41:49 IP:211.162.xxx.xxx 未訂閱
collonil大大,谢谢您热情洋溢的回答,您言之有理,在每一行的结尾都有0D 0A,要不然看到的就只有一连穿的字符,最后一行是多了一组0D 0A,您清晰明了的解释让我豁然开朗 >),想不到您是用 > 下面的内容已经偏题了,> 自行繼承 > 我试着去做,但是有点晕: class="code"> TStrings::SaveToFile virtual void __fastcall SaveToFile(const AnsiString FileName) 我打开classes.pas来看看SaveToFile的原貌(以下是复制的classes.pas中的code) ...... procedure SaveToFile(const FileName: string); virtual; ...... procedure TStrings.SaveToFile(const FileName: string); var Stream: TStream; begin Stream := TFileStream.Create(FileName, fmCreate); try SaveToStream(Stream); finally Stream.Free; end; end; ...... 看样子,它也是继承别人的,是来自TStream,打开Help,它说TStream就在classes.pas中,接着在该单元文件中找,但是已经找不下去了,我迷失在code的汪洋大海中了,您能否教教我该如何找.如果您方便的话,给点相关 > ******************** 人生在勤,不索何获? ********************
------
人生在勤,不索何获?
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-30 12:31:17 IP:61.231.xxx.xxx 未訂閱
看到 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()));
}
沒測試過,參考就好 <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
系統時間:2024-05-02 15:47:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!