線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1310
推到 Plurk!
推到 Facebook!

TStringList的限制

尚未結案
vip88
一般會員


發表:8
回覆:23
積分:6
註冊:2002-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-23 18:33:30 IP:61.221.xxx.xxx 未訂閱
使用TStringList來讀取大檔,似乎有侷限, TStringList* FileList = new TStringList(); FileList->LoadFromFile("C:\\Test.txt"); //170MB的大檔(178,400,477 bytes) FileList->SaveToFile("C:\\Test2.txt"); delete FileList; 但實際上得到的Test2.txt只有14.7MB(15,481,015 bytes)… 請問各位大大,是不是有我沒有注意到的問題? 環境: Windows 2000, BCB 5 sp1 歡迎光臨神奇力量網 http://www.688.idv.tw/
------
歡迎光臨神奇力量網

http://mpn.adsldns.org/
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-24 01:03:29 IP:61.228.xxx.xxx 未訂閱
我在 Windows 2000 使用 BCB6 SP2 做了一個 149 MB 的檔案, 經測試發現一切正常, 所以建議您使用新的版本.    Jesse Chan
------
Jesse Chan
dllee
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-24 08:27:13 IP:61.224.xxx.xxx 未訂閱
我是用 XP HomeEd BCB5 SP1 沒有什麼問題。 是否您的檔案不是純文字檔呢? 以下是我的測試程式,您可以試試看,應該是不會有因大檔案有問題, 當然,如果大於 4G,應該就會有問題,但 4G 之內的應該都是 ok 才對。 而且 TStringList 的 SaveToFile/LoadFromFile 都是叫用 TFileStream, 如果有問題,那 TFileStream 也會有問題。
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//----------------------------------------------------------------------------//
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *FileList;
//----------------------------------------------------------------------------//
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  FileList=new TStringList;
}
//----------------------------------------------------------------------------//
__fastcall TForm1::~TForm1()
{
  delete FileList;
}
//----------------------------------------------------------------------------//    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int iSize=Edit1->Text.ToIntDef(100);
  Edit1->Text=iSize;
  int iLines=iSize*4096; // 每一行 256 字(含跳行字元)
  AnsiString as;      int iFileHandle;
  iFileHandle = FileOpen(Edit2->Text, fmOpenReadWrite|fmShareExclusive);      if (FileExists(Edit2->Text))
    iFileHandle = FileOpen(Edit2->Text, fmOpenReadWrite|fmShareExclusive);
  else
    iFileHandle = FileCreate(Edit2->Text);      if(iFileHandle<0)
  {
    ShowMessage("File Create/Open Error!");
    return;
  }      for(int i=0;iLoadFromFile(Edit2->Text);
  ShowMessage("FileList->Count="+String(FileList->Count)
           +"\nFileList->Text.Length()="+String(FileList->Text.Length()));
}
//----------------------------------------------------------------------------//
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  FileList->SaveToFile(Edit2->Text+".out");
  ShowMessage("File Save OK!");
}
//----------------------------------------------------------------------------//
沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell.... 發表人 - dllee 於 2003/09/24 08:30:48
------
http://www.ViewMove.com
vip88
一般會員


發表:8
回覆:23
積分:6
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-24 11:39:47 IP:61.221.xxx.xxx 未訂閱
謝謝兩位大大熱心的測試與指導。 >) 謝謝。 歡迎光臨神奇力量網
------
歡迎光臨神奇力量網

http://mpn.adsldns.org/
vip88
一般會員


發表:8
回覆:23
積分:6
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-24 23:39:47 IP:61.221.xxx.xxx 未訂閱
經過多次的驗證,終於找出問題,原來是\0搞的鬼。    sql2gdb忠實把欄位的null terminated char寫出, 造成TStringList讀取,讀到\0就終止了,這也是為 什麼大檔使用TStringList Load再Save只有14.7MB 的原因,因為讀到\0,TStringList就終止了。    把sql2gdb改寫之後,把\0吃掉,TStringList再去讀 取與存檔就沒有問題。    感謝兩位大大熱情的支援,謝謝。 歡迎光臨神奇力量網
------
歡迎光臨神奇力量網

http://mpn.adsldns.org/
系統時間:2024-04-26 14:45:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!