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

也是讀txt檔的問題

尚未結案
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-23 01:34:43 IP:203.73.xxx.xxx 未訂閱
我在之前的主題中找到這一段程式    可是如果真的要讀一個文字檔來說    因為範列只是用一個AnsiString先寫好資料     可是如果用LoadFromFile讀入來的檔案    型態又不是AnsiString ><”    怎麼辦呢,這樣我就不會輸出來edit上了         
AnsiString sz="12,0A,13,44";
       TStringList *sl=new TStringList;
       sl->CommaText=sz;
       Edit1->Text=sl->Strings[0];
       Edit2->Text=sl->Strings[1];
       Edit3->Text=sl->Strings[2];
       Edit4->Text=sl->Strings[3];           sz=sl->Strings[1];
       delete sl; 
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-23 08:15:49 IP:219.132.xxx.xxx 未訂閱
derekyppp:    FILE *file1;
file1=fopen(OpenDialog1->FileName.c_str(),"r");
TStrings* Str = new TStringList();  // 建立一個TStrings
char msg[254];    fseek(file1, 0, SEEK_SET); // 文字檔頭
while (!feof(file1))       // 讀取文字檔
{
  StrPCopy(msg,'\0');
  fgets(msg, 254, file1);  // 以行讀入
  Str->CommaText=msg;      // 置入TStrings 它會自動將以空白及逗點斷字串
  for (int i=0;i < Str->Count;i  )
    // Str->Strings[i];     // 這是你要的
    // 例Edi1->Text=Str->Strings[0];
  
}
delete Str;   // 請記得delete
請參考
Andy Chang
------
Andy Chang
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-23 08:23:40 IP:219.132.xxx.xxx 未訂閱
derekyppp:    FILE *file1;
file1=fopen(OpenDialog1->FileName.c_str(),"r");
TStrings* Str = new TStringList();  // 建立一個TStrings
char msg[254];    fseek(file1, 0, SEEK_SET); // 文字檔頭
while (!feof(file1))       // 讀取文字檔
{
  StrPCopy(msg,'\0');
  fgets(msg, 254, file1);  // 以行讀入
  Str->CommaText=msg;      // 置入TStrings 它會自動將以空白及逗點斷字串
  for (int i=0;i < Str->Count;i  )
    // Str->Strings[i];     // 這是你要的
    // 例Edi1->Text=Str->Strings[0];
  
}
delete Str;   // 請記得delete
如以Memo(ListBox)的話:
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
//ListBox1->Items->LoadFromFile(OpenDialog1->FileName);
for (int i=0; i< Memo1->Lines->Count; i  ) {
    Str->CommaText=Memo1->Lines->Strings[i];
    // Str->Strings[i];     // 這是你要的
    // 例Edi1->Text=Str->Strings[0];
}    請參考
Andy Chang
------
Andy Chang
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-23 08:49:59 IP:211.74.xxx.xxx 未訂閱
請問一下 我把那段程式碼編譯的時候出現了問題了耶 FILE *file1; bcb好像看不懂什麼是file 也不知道什麼是fopen()、fseek() 這幾個函式我只曾經在turbo c用過 不知道,在bcb中是不是要額外include什麼檔呢?
CuteBabyBoy
初階會員


發表:18
回覆:97
積分:48
註冊:2003-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-23 09:26:36 IP:218.167.xxx.xxx 未訂閱
請輸入    #include  Baby
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-23 09:28:31 IP:219.132.xxx.xxx 未訂閱
引言: 請問一下 我把那段程式碼編譯的時候出現了問題了耶 FILE *file1; bcb好像看不懂什麼是file 也不知道什麼是fopen()、fseek() 這幾個函式我只曾經在turbo c用過 不知道,在bcb中是不是要額外include什麼檔呢?
#include "stdio.h" 你也可以 Memo1->Lines->LoadFromFile(OpenDialog1->FileName); 或 ListBox1->Items->LoadFromFile(OpenDialog1->FileName); 處理! 請參考 Andy Chang
------
Andy Chang
CuteBabyBoy
初階會員


發表:18
回覆:97
積分:48
註冊:2003-07-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-23 09:28:37 IP:218.167.xxx.xxx 未訂閱
Sorry ! 太久沒回應問題了..><    請輸入  
#include 
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-23 10:25:56 IP:211.74.xxx.xxx 未訂閱
我還是有問題耶…就是阿~(把我程式整理了一下)    發現如果讀的文字檔是內容是    12 43 45 56     就都會正常顯示    可是如果是    12 43 45 56  12 43 45 56     變成兩行時候就會出現錯誤 list index out of bound(1)    是為什麼?還有這個錯誤訊息怎麼翻譯呢?我用字典查出來的解釋怪怪的         
 
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{            TStrings* Str = new TStringList();            if (OpenDialog1->Execute())
        Memo1->Lines->LoadFromFile(OpenDialog1->FileName);                for (int i=0; i< Memo1->Lines->Count; i  ) {
             Str->CommaText=Memo1->Lines->Strings[i];
        }
        Edit1->Text=Str->Strings[0];
        Edit2->Text=Str->Strings[1];
        Edit3->Text=Str->Strings[2];    }
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-23 10:29:50 IP:219.84.xxx.xxx 未訂閱
如果你的txt檔是一行一個值 共4行 請用下列方法:      
       TStringList *sl=new TStringList;
       sl->LoadFormFile("c:\\test.txt");
       Edit1->Text=sl->Strings[0];
       Edit2->Text=sl->Strings[1];
       Edit3->Text=sl->Strings[2];
       Edit4->Text=sl->Strings[3];
       delete sl; 
如果你的txt檔是一行4個值用逗號隔開 請用下列方法:
       TStringList *sl=new TStringList;
       sl->LoadFormFile("c:\\test.txt");
       sl->CommaText=sl->Strings[0];
       Edit1->Text=sl->Strings[0];
       Edit2->Text=sl->Strings[1];
       Edit3->Text=sl->Strings[2];
       Edit4->Text=sl->Strings[3];
       delete sl;  
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-23 11:02:02 IP:211.74.xxx.xxx 未訂閱
阿><”不行~不行~ 用了bass15大大的兩種方法都一樣會出現錯誤訊息 list index out of bound 那我重說一下 我的問題 我就是想寫一個game阿 想建一個文字檔,裡面放玩家的資料 像是這樣 danny 18 29 39 493 may 33 45 99 32 (不一定要用空格 逗號也可以) 主要就是把資料分類存 但也希望可以一筆筆拿出來 請大大幫我一下^^
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-23 12:26:45 IP:211.76.xxx.xxx 未訂閱
derekyppp你好:     會出現list index out of bound的原因在你的TStringList取值時,超過大小。比如說Str物件裡只有三個AnsiString,但碼程碼卻用執行了Str->Strings[3]。試圖要取出第四個字串。     建議你的程式碼運用兩個TStringList,第一個用LoadFromFile來讀入一行一行的字串。第二個把每一行的字串作分解。程式碼的例子如下:     
 
//---------------------------------------------------------------------------
#include     void __fastcall TForm1::Button1Click(TObject *Sender)
{    const int EditCount = 4;
TEdit* EditList[EditCount] = {Edit1,Edit2,Edit3,Edit4};
std::auto_ptr ClipData(new TStringList);
std::auto_ptr SplitData(new TStringList);
ClipData->LoadFromFile("yourfile.txt");    for(int Index = 0;Index < ClipData->Count;  Index)
        {
        SplitData->Text = StringReplace(
            ClipData->Strings[Index],
            " ","\n",TReplaceFlags() <<  rfReplaceAll);
        //  用Replace把" "空白,轉成換行。
        //  不用Delimiter的原因是因為TStringList在處理連續兩個
        //  Delimiter時,只會當成一個來看。造成資料的shift
        for(int Token = 0;Token < SplitData->Count &&
                          Token < EditCount
                          ;  Token)
            EditList[Token]->Text = SplitData->Strings[Token];
        }
}
//---------------------------------------------------------------------------    
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-24 09:57:51 IP:219.130.xxx.xxx 未訂閱
引言: 我還是有問題耶…就是阿~(把我程式整理了一下) 發現如果讀的文字檔是內容是 12 43 45 56 就都會正常顯示 可是如果是 12 43 45 56 12 43 45 56 變成兩行時候就會出現錯誤 list index out of bound(1) 是為什麼?還有這個錯誤訊息怎麼翻譯呢?我用字典查出來的解釋怪怪的
 
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        TStrings* Str = new TStringList();
        if (OpenDialog1->Execute())
        Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
        for (int i=0; i< Memo1->Lines->Count; i  ) {
             Str->CommaText=Memo1->Lines->Strings[i];
        }
        Edit1->Text=Str->Strings[0];
        Edit2->Text=Str->Strings[1];
        Edit3->Text=Str->Strings[2];
}
derekyppp: 按照你程式錯誤原因有可能是你文字檔案多一空白行 所以你應該是 Str->CommaText=Memo1->Lines->Strings[i]; if (Str->Count > 3) { //檢查導入資料有幾段是否滿足 Edit1->Text=Str->Strings[0]; Edit2->Text=Str->Strings[1]; Edit3->Text=Str->Strings[2]; } Andy Chang
------
Andy Chang
koni
一般會員


發表:5
回覆:12
積分:3
註冊:2004-05-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-25 20:33:23 IP:61.70.xxx.xxx 未訂閱
引言: 阿><”不行~不行~ 用了bass15大大的兩種方法都一樣會出現錯誤訊息 list index out of bound 那我重說一下 我的問題 我就是想寫一個game阿 想建一個文字檔,裡面放玩家的資料 像是這樣 danny 18 29 39 493 may 33 45 99 32 (不一定要用空格 逗號也可以) 主要就是把資料分類存 但也希望可以一筆筆拿出來 請大大幫我一下^^
我也正在做一件類似的事,經由上次的發問~我用的是下面的方法: 首先,先建一個struct來放所謂的「一筆」資料
typedef struct
{
  AnsiString Name;
  int        str;
  int        dex;
  int        def;
  int        mig;
}MyStruct;
  int i;
  int count;
  TStrings *Str = new TStringList;      Str->LoadFromFile(FileName);
  Str->Delimiter = ' ';                //分格符號為空白,亦可自定
  Str->DelimitedText = Str->Text;      /*如此可以將檔案內的字,以分格符號分為若干個字串(AnsiString)
    共有 Str->Count 這麻多個,得到這些字串後,我用下面的方法處理,使其存到struct中 */        MyStruct *UsersInfo = new MyStruct [Str->Count/4];       for(i=0,count=0;iCount;i  )
  {
    switch(i%4)
    {
      case 0:
        UsersInfo [c].str= Str->Strings[i];
        break;
      case 1:
        UsersInfo [c].dex= Str->Strings[i];
        break;
      case 2:
        UsersInfo [c].def= Str->Strings[i];
        break;
     case 3:
        UsersInfo [c].mig= Str->Strings[i];
        count  ;
        break;
    }
  }
用以上的方法就可以讀出文字檔的資料,從 struct中可以取得各玩家的屬性 ex:UsersInfo[0].str、UsersInfo[0].dex等… 以上是讀檔的方法,若是要「寫檔」的話,可以配合上面所用的Struct(MyStruct)來設計。 這個方法我也不知道好不好,可以參考看看啦^^~希望對您有幫助. By Koni.
koni
一般會員


發表:5
回覆:12
積分:3
註冊:2004-05-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-25 20:43:57 IP:61.70.xxx.xxx 未訂閱
Sorry~ 容我修改一下上一篇的內容,有點小錯誤⊙⊙..    [quote] 我也正在做一件類似的事,經由上次的發問~我用的是下面的方法: 首先,先建一個struct來放所謂的「一筆」資料    
  typedef struct
  {
    AnsiString Name;
    int        str;
    int        dex;
    int        def;
    int        mig;
  }MyStruct;
  int i;
  int count;
  TStrings *Str = new TStringList;      Str->LoadFromFile(FileName);
  Str->Delimiter = ' ';                //分格符號為空白,亦可自定
  Str->DelimitedText = Str->Text;      /*如此可以將檔案內的字,以分格符號分為若干個字串(AnsiString)
    共有 Str->Count 這麻多個,得到這些字串後,我用下面的方法處理,使其存到struct中 */        MyStruct *UsersInfo = new MyStruct[Str->Count/5];  //五個string為一筆資料      for(i=0,count=0;iCount;i  )
  {
    switch(i%5)
    {
      case 0:  
        UsersInfo [c].Name = Str->Strings[i];
        break;
      case 1:
        UsersInfo [c].str = StrToInt( Str->Strings[i] );
        break;
      case 2:
        UsersInfo [c].dex = StrToInt( Str->Strings[i] );
        break;
      case 3:
        UsersInfo [c].def = StrToInt( Str->Strings[i] );
        break;
      case 4:
        UsersInfo [c].mig = StrToInt( Str->Strings[i] );
        count  ;
        break;
    }
  }
用以上的方法就可以讀出文字檔的資料,從 struct中可以取得各玩家的屬性 ex:UsersInfo[0].Name、UsersInfo[0].str、UsersInfo[0].dex等… 以上是讀檔的方法,若是要「寫檔」的話,可以配合上面所用的Struct(MyStruct)來設計。 這個方法我也不知道好不好,可以參考看看啦^^~希望對您有幫助. By Koni. [quote] QQ"
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-25 21:11:10 IP:203.67.xxx.xxx 未訂閱
^^ 我發現這段程式是我想要的耶 而且我也難得看懂了 不過把他拿到bcb編譯後 發現了靈『譯』現象啦 明明只拉了一個form和按鈕 編譯過了 但執行時出現了edit1 is not valid integer value 這段程式中 有動態產生了edit元件嗎@@" 我好像沒找到耶 還有想順便問一下 Str->Delimiter = ' '; Str->DelimitedText = Str->Text; Tstringlist 的這兩個方法(Delimiter )、(DelimitedText ) 有點不懂耶 我查了help的說明 還是不太了解@@"
koni
一般會員


發表:5
回覆:12
積分:3
註冊:2004-05-02

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-08-25 22:07:41 IP:61.70.xxx.xxx 未訂閱
引言: ^^ 我發現這段程式是我想要的耶 而且我也難得看懂了 不過把他拿到bcb編譯後 發現了靈『譯』現象啦 明明只拉了一個form和按鈕 編譯過了 但執行時出現了edit1 is not valid integer value 這段程式中 有動態產生了edit元件嗎@@" 我好像沒找到耶 還有想順便問一下 Str->Delimiter = ' '; Str->DelimitedText = Str->Text; Tstringlist 的這兩個方法(Delimiter )、(DelimitedText ) 有點不懂耶 我查了help的說明 還是不太了解@@"
Hello~ 上面的code中~我沒有用到TEdit的元件阿@@"~怪怪... Delimiter是你的分格字元(char) DelimitedText是你所要動作的文字(StringList) 在上面的code中,我設定的分格符號是空白(' '), 而我要處理的文字就是從檔案Load到的所有文字(Str->Text), 我舉個例個好了:下面有一個文字檔 ----------text.txt---------------- userA 1 2 3 4 userB 5 6 7 8 ---------------------------------
  Str->LoadFromFile("text.txt");
  Str->Delimiter = ' ';                //分格符號為空白,亦可自定
  Str->DelimitedText = Str->Text;
Str->Text即是文字檔中所有的文字,而分格符號為空白,所以被割為10個字串(AnsiString), Str->Count為10、Str->Strings[0] = userA、Str->Strings[1] = 1…以此類推 付帶一提,如果沒有設Delimiter及DelimitedText的話,所取到的結果如下 Str->Count = 2 Str->Strings[0] = userA 1 2 3 4 Str->Strings[1] = userB 5 6 7 8 報告完畢^^" 希望對你有幫助QQ" by Koni.
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-08-25 23:21:28 IP:203.67.xxx.xxx 未訂閱
可以了耶 成功了^______^ 可是…還是有別的問題@@" 就素阿~ Str->Delimiter = 'z'; //分格符號為空白,亦可自定 Str->DelimitedText = Str->Text; 我發現如果用了這兩行 碰到z的前後文會自動分兩部份 就象這樣 dannyzqqq →變成danny qqq 但是除了一開始設的z有效外,連' '空白也有效 dannyzqqq dd →自動變成了三份 Str->Strings[0]; Str->Strings[1]; Str->Strings[3]; 莫名多一個陣列,然後我的程式就錯亂了@@" ps。因為我是要做一個日記系統,其實也不能用空白來當格隔的符號 請問有誰知道 這該怎麼辦嗎?_?
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-08-26 10:20:52 IP:219.84.xxx.xxx 未訂閱
你存入檔案的時候先把所有的 半型空格 轉成 全型空格 就好了 還有日記裡出現 '\r' '\n' 等換行符號也要一倂改成別的字替換 讀入時再把它改回來.. 發表人 - bass15 於 2004/08/26 10:33:53
ubong
一般會員


發表:2
回覆:42
積分:23
註冊:2002-10-02

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-08-26 23:24:15 IP:218.163.xxx.xxx 未訂閱
我認為你的需求可用下列方式來寫入和讀出檔案較好處理資料 #include  void main() { FILE *ffw,*ffr;// 應#include<stdil.h> struct ss { //使用struct 來放資料 char name[10]; char s1[3]; char s2[3]; char s3[3]; } list; ffw=fopen("test.txt","w");//開啟用來寫入檔案 strcpy(list.name,"Mary"); strcpy(list.s1,"11"); strcpy(list.s2,"22"); strcpy(list.s3,"33"); fwrite(&list,sizeof(list),1,ffw);// 寫入檔案名為test.txt ffr=fopen("test.txt","r");//開啟用來讀出檔案 fread(&list,sizeof(list),1,ffr); //從test.txt 讀出資料 /* 大量讀出檔案 for(;;) { if(!fread(&list,sizeof(list),1,ffr)) break; 將list加以處理 } */ //以上可用在C Builder 下面一行只適用於Dos Or console printf("%s %s %s %s",list.name,list.s1,list.s2,list.s3);// } ubong
------
ubong
ubong
一般會員


發表:2
回覆:42
積分:23
註冊:2002-10-02

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-08-26 23:26:55 IP:218.163.xxx.xxx 未訂閱
Sorry 應是#include<stdio.h> ubong
------
ubong
koni
一般會員


發表:5
回覆:12
積分:3
註冊:2004-05-02

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-08-27 01:22:44 IP:61.70.xxx.xxx 未訂閱
日記系統意謂這裡面可能含有的字也很難預先得知,安全起見, 我覺得可能要用不只一個字完來做為分格一筆資料 用一些比較難同時出現的字元當做切割的“分格字串“,像是#@、#%、$@、等等這類 比較少連用的字元,不過這樣一來就不適用TStringList的Delimiter了(Delimiter只能是char), (TStringList的物件很方便,相對的~功能也被限制住了) 比較麻煩的做法,可以試試有點類似XML的結構做法,不過可能程式處理上的步驟會多一點。 ps:個人認為其他大大的意見也不錯^^",要動動腦嚕~ by Koni.
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#22 引用回覆 回覆 發表時間:2004-08-27 19:58:16 IP:203.67.xxx.xxx 未訂閱
謝謝大家這麼用心的回題 ^^ 這個問題真的困擾我好久喔 不過最後可能會採用資料庫的方式來做 這樣資料自動就可以讓自己的分好幾筆 而『日記內容』如果有一些特殊文字或是空格也可以一並解決 不過還是謝謝大家喔 記得在tubro c的時候 我最怕最搞不懂的就是有關檔案方面的函數 這次真的讓我學了好多呢^___^
系統時間:2024-06-02 15:16:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!