請教讀txt檔的相關問題(內含中文字)~ |
尚未結案
|
koni
一般會員 ![]() ![]() 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
|
nlj859
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
Hello koni, 請參考底下程式碼:
它會把每一個字串放到一個字元陣列存放.
int i=0; char Split[5][5]; char str[30]; char *tok=NULL; AnsiString aaa="哥哥 76 爸 88 100"; strcpy(str,aaa.c_str()); tok = strtok(str," "); while (tok!=NULL ) { strcpy(Split[i],tok); i ; tok = strtok(NULL, " "); } //於Label秀出結果 Label1->Caption=Split[0]; Label2->Caption=Split[1]; Label3->Caption=Split[2]; Label4->Caption=Split[3]; Label5->Caption=Split[4];有關讀檔的動作請自行依照需求修改. 或: void __fastcall TForm1::Button1Click(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]; Edit2->Text=Str->Strings[3]; Edit3->Text=Str->Strings[4]; delete Str; }發表人 - nlj859 於 2004/08/23 11:55:21 |
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
andychang1690
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
koni: 重點是如何處理以下是一例子 // 我用fopen()開檔 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]; // 這是你要的 } delete Str; // 請記得delete 請參考Andy Chang 發表人 - andychang1690 於 2004/08/23 08:12:05
------
Andy Chang |
koni
一般會員 ![]() ![]() 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
引言: koni你好: fread應該是可以讀出來的,不知道你能否post你的程式碼?並且說明讀出的錯誤在那?void __fastcall TForm1::btTestClick(TObject *Sender) { int i; FILE *fp; fp = fopen(MusicFileList->FileName.c_str(),"rb"); char ch; char c[100]; for(i=0,fread(&ch,1,1,fp);feof(fp)==0;i ,fread(&ch,1,1,fp)) { c[i]= ch; } //檢查所讀出字元資料 for(int j=0;jLines->Add(c[j]); } } 剛去討論區找了點相關的文章,大概知道問題可能是中文字是寬字元,上面的程式一次都只讀1Bype,所以就英文字來說讀的出來,但是中文字就把一個字看成兩個了,所以讀出來有問題。 |
koni
一般會員 ![]() ![]() 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
引言:謝謝你啦,我試了這個方法,但是用TStringList的CommaText把我要的空白(ASCII碼32)和斷行給自動截掉了,我用Memo來檢測所讀到的資料,結果為 for (i=0;i < Str->Count;i++) { Memo1->Lines->Add(Str->Strings[i]); }koni: 重點是如何處理以下是一例子 // 我用fopen()開檔 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]; // 這是你要的 } delete Str; // 請記得delete 請參考Andy Chang 發表人 - andychang1690 於 2004/08/23 08:12:05 |
andychang1690
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
Andy Chang引言: void __fastcall TForm1::btTestClick(TObject *Sender) { int i; AnsiString s; FILE *fp; fp = fopen(MusicFileList->FileName.c_str(),"rb"); char ch; char c[100]; for(i=0,fread(&ch,1,1,fp);feof(fp)==0;i++,fread(&ch,1,1,fp)) { c[i]= ch; } //檢查所讀出字元資料 for(int j=0;jLines->Add(s); } else Memo1->Lines->Add(c[j]); } } 剛去討論區找了點相關的文章,大概知道問題可能是中文字是寬字元,上面的程式一次都只讀1Bype,所以就英文字來說讀的出來,但是中文字就把一個字看成兩個了,所以讀出來有問題。請參上面紅字部分!+為全型請自行改為半型。
------
Andy Chang |
koni
一般會員 ![]() ![]() 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
引言:謝謝Andy你的方法,確實有用^^" 請教一下原理是什麻呢?為什麻(c[j] & 0x80)就可以知道是不是中文字呢? 麻煩嚕~多謝指教QQ"請參上面紅字部分!+為全型請自行改為半型。 Andy Chang引言: void __fastcall TForm1::btTestClick(TObject *Sender) { int i; AnsiString s; FILE *fp; fp = fopen(MusicFileList->FileName.c_str(),"rb"); char ch; char c[100]; for(i=0,fread(&ch,1,1,fp);feof(fp)==0;i++,fread(&ch,1,1,fp)) { c[i]= ch; } //檢查所讀出字元資料 for(int j=0;jLines->Add(s); } else Memo1->Lines->Add(c[j]); } } 剛去討論區找了點相關的文章,大概知道問題可能是中文字是寬字元,上面的程式一次都只讀1Bype,所以就英文字來說讀的出來,但是中文字就把一個字看成兩個了,所以讀出來有問題。 |
andychang1690
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引用liangnet大說法
首先你要先了解一下雙字元編碼的規則!
雙字元的編碼第一個碼為0x80 ~ 0xFF
因此你在讀一個字元時判斷該碼是否為0x80 ~ 0xFF,若是則表示是雙字元編碼的第一碼!
http://delphi.ktop.com.tw/topic.php?topic_id=54017
若你要問& 0x80
請見
http://delphi.ktop.com.tw/topic.php?topic_id=41267
引用taishyang版大的話
&做AND邏輯位元運算
&&做AND邏輯判斷
Albertz 大的話
&是bitwise 運算
&&是logical 運算 請參考 Andy Chang 發表人 - andychang1690 於 2004/08/24 08:06:42
------
Andy Chang |
koni
一般會員 ![]() ![]() 發表:5 回覆:12 積分:3 註冊:2004-05-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |