也是讀txt檔的問題 |
尚未結案
|
derekyppp
一般會員 發表:16 回覆:33 積分:9 註冊:2004-02-20 發送簡訊給我 |
我在之前的主題中找到這一段程式 可是如果真的要讀一個文字檔來說 因為範列只是用一個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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
CuteBabyBoy
初階會員 發表:18 回覆:97 積分:48 註冊:2003-07-11 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 請問一下 我把那段程式碼編譯的時候出現了問題了耶 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 發送簡訊給我 |
|
derekyppp
一般會員 發表:16 回覆:33 積分:9 註冊:2004-02-20 發送簡訊給我 |
我還是有問題耶…就是阿~(把我程式整理了一下) 發現如果讀的文字檔是內容是 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 發送簡訊給我 |
如果你的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 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
derekyppp你好:
會出現list index out of bound的原因在你的TStringList取值時,超過大小。比如說Str物件裡只有三個AnsiString,但碼程碼卻用執行了Str->Strings[3]。試圖要取出第四個字串。
建議你的程式碼運用兩個TStringList,第一個用LoadFromFile來讀入一行一行的字串。第二個把每一行的字串作分解。程式碼的例子如下:
//--------------------------------------------------------------------------- #include |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 我還是有問題耶…就是阿~(把我程式整理了一下) 發現如果讀的文字檔是內容是 12 43 45 56 就都會正常顯示 可是如果是 12 43 45 56 12 43 45 56 變成兩行時候就會出現錯誤 list index out of bound(1) 是為什麼?還有這個錯誤訊息怎麼翻譯呢?我用字典查出來的解釋怪怪的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 Changvoid __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]; }
------
Andy Chang |
koni
一般會員 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
引言: 阿><”不行~不行~ 用了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;i用以上的方法就可以讀出文字檔的資料,從 struct中可以取得各玩家的屬性 ex:UsersInfo[0].str、UsersInfo[0].dex等… 以上是讀檔的方法,若是要「寫檔」的話,可以配合上面所用的Struct(MyStruct)來設計。 這個方法我也不知道好不好,可以參考看看啦^^~希望對您有幫助. By Koni. |
koni
一般會員 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
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;i用以上的方法就可以讀出文字檔的資料,從 struct中可以取得各玩家的屬性 ex:UsersInfo[0].Name、UsersInfo[0].str、UsersInfo[0].dex等… 以上是讀檔的方法,若是要「寫檔」的話,可以配合上面所用的Struct(MyStruct)來設計。 這個方法我也不知道好不好,可以參考看看啦^^~希望對您有幫助. By Koni. [quote] QQ" |
derekyppp
一般會員 發表:16 回覆:33 積分:9 註冊:2004-02-20 發送簡訊給我 |
^^ 我發現這段程式是我想要的耶 而且我也難得看懂了 不過把他拿到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 發送簡訊給我 |
引言: ^^ 我發現這段程式是我想要的耶 而且我也難得看懂了 不過把他拿到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 發送簡訊給我 |
可以了耶 成功了^______^ 可是…還是有別的問題@@" 就素阿~ 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 發送簡訊給我 |
|
ubong
一般會員 發表:2 回覆:42 積分:23 註冊:2002-10-02 發送簡訊給我 |
我認為你的需求可用下列方式來寫入和讀出檔案較好處理資料
#include
------
ubong |
ubong
一般會員 發表:2 回覆:42 積分:23 註冊:2002-10-02 發送簡訊給我 |
|
koni
一般會員 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
日記系統意謂這裡面可能含有的字也很難預先得知,安全起見,
我覺得可能要用不只一個字完來做為分格一筆資料 用一些比較難同時出現的字元當做切割的“分格字串“,像是#@、#%、$@、等等這類
比較少連用的字元,不過這樣一來就不適用TStringList的Delimiter了(Delimiter只能是char),
(TStringList的物件很方便,相對的~功能也被限制住了) 比較麻煩的做法,可以試試有點類似XML的結構做法,不過可能程式處理上的步驟會多一點。 ps:個人認為其他大大的意見也不錯^^",要動動腦嚕~ by Koni.
|
derekyppp
一般會員 發表:16 回覆:33 積分:9 註冊:2004-02-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |