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

請問讀TXT檔入二維陣列問題?

尚未結案
se0528
一般會員


發表:13
回覆:22
積分:7
註冊:2005-05-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-06 16:01:51 IP:163.28.xxx.xxx 未訂閱
我現在想讀入一個TXT檔如下 2,3 3,4 4,5 我希望能將每列的數值分別存在a[i][0],a[i][1]中 且如果分隔符號由逗號變成空格 是否也可以適用 以下是我目前所寫的程式  
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a[100][2];
TStringList *inf = new TStringList;
if (OpenDialog1->Execute())
  {
  inf->LoadFromFile(OpenDialog1->FileName);
  for (int i=0;i<100;i  )
    {
    int count=0;
    a[count][0]=StrToFloat(inf->Strings[i]);
    count  ;
    }
  }
delete inf;
}
此外for (int i=0;i<100;i )中i<100的條件是我亂給的 可以修改成依資料筆數自動調整嗎?
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-06 22:33:32 IP:203.204.xxx.xxx 未訂閱
您好: 讀入每一行的資料可利用下面討論去做分割. http://delphi.ktop.com.tw/topic.php?topic_id=70382 分割完成後再用StrToInt存成你要的陣列.    for (int i=0;i<100;i )改成 for (int i=0;iLines->Count-1;i ) inf->Lines->Count就是他的數量了,看您TXT有幾筆Count就會是幾筆的數字. 發表人 - supman 於 2005/05/06 22:34:37
se0528
一般會員


發表:13
回覆:22
積分:7
註冊:2005-05-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-06 23:13:13 IP:163.28.xxx.xxx 未訂閱
我有看過這篇文章耶,但是我用bcb 6.0 去執行時會出現 [C Error] Unit1.cpp(22): E2108 Improper use of typedef 'String' [C Error] Unit1.cpp(22): E2268 Call to undefined function 'Split' [C Error] Unit1.cpp(22): E2108 Improper use of typedef 'String' 這又是什麼原因!! 謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-07 00:53:21 IP:219.137.xxx.xxx 未訂閱
se0528 您好:    以您的 case 來看,將程式敘述改成如下所示,應可符合您的需求:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float a[100][2];
    TStringList *inf = new TStringList;
    if (OpenDialog1->Execute()) {
        inf->LoadFromFile(OpenDialog1->FileName);
        AnsiString tmp;  // 暫存用,以簡化拆解的敘述
        int pos;  // 紀錄分隔符號位置,以作拆解之用
        for (int i=0; iCount; i  ) {
            tmp = inf->Strings[i];  // 取得第 i 個字串,設給暫存變數
            pos = tmp.Pos(",");  // 取得逗號位置
            a[i][0] = StrToFloat(tmp.SubString(1, pos-1));  // 紅色標示處為取得逗號之前的資料
            a[i][1] = StrToFloat(tmp.SubString(pos 1, tmp.Length()-pos));  // 紅色標示處為取得逗號之後的資料
        }
    }
    delete inf;
}
您在敘述中設定的 count 變數是不必要的 (直接以迴圈的 i 值代入即可),而且設定位置錯誤,其最大累加值僅會為 1。 建議您養成查看 Help 的習慣,如果您查閱 TStringList 的說明,您就會知道它有 Count 屬性可使用,如果您查閱 AnsiString 的說明,您就會知道 Pos()、Lenght()、SubString()....等函數的用途。
se0528
一般會員


發表:13
回覆:22
積分:7
註冊:2005-05-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-07 01:15:30 IP:163.28.xxx.xxx 未訂閱
太感謝二位的幫助,尤其給我魚吃,還教我如何釣魚, 我已經試成功了,謝謝!!
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-07 01:15:50 IP:203.204.xxx.xxx 未訂閱
您好: 教您一個偷懶的切割字串方式 void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *List; List=new TStringList; AnsiString S="1,2"; S=StringReplace(S,",","\r\n",TReplaceFlags()<Text=S; ShowMessage(List.Strings[0])//存到您的a[i][0]; ShowMessage(List.Strings[1])//存到您的a[i][1]; List->Free(); } 結合到您的程式
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a[100][2];
TStringList *inf = new TStringList;
TStringList *List = new TStringList;
AnsiString S;
if (OpenDialog1->Execute())
 {
  inf->LoadFromFile(OpenDialog1->FileName);
  for (int i=0;iCount;i  )
   {
    S=StringReplace(inf->Strings[i],",","\r\n",TReplaceFlags()<Text=S;//轉至TStringList物件後,他會自動解析.
    a[i][0]=StrToFloat(List->Strings[0]);
    a[i][1]=StrToFloat(List->Strings[1]);
   }
 }
inf->Free();
List->Free();
}
系統時間:2024-11-23 18:37:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!