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

請教讀txt檔的相關問題(內含中文字)~

尚未結案
koni
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-23 00:54:54 IP:61.70.xxx.xxx 未訂閱
想要讀一個文字檔,例如 01 哥 100 02 哥 200 03 爸 300 04 爸 400 05 真 500 06 偉 250 07 大 320    目的要將這一個檔的字元一一截取出來 也就是最後要取出 01[空白]哥[空白]100[段行]02[空白]…    中間包含了中文字,我用C語言的fread取不出來,所以想請教一下 有什麻方法可以將其文字一一取出。    謝謝嚕~ < >< >
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-23 01:19:09 IP:219.80.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-23 01:29:44 IP:211.76.xxx.xxx 未訂閱
koni你好: fread應該是可以讀出來的,不知道你能否post你的程式碼?並且說明讀出的錯誤在那?
andychang1690
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-23 08:09:00 IP:219.132.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-23 17:06:38 IP:61.70.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-23 17:32:16 IP:61.70.xxx.xxx 未訂閱
引言:
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
謝謝你啦,我試了這個方法,但是用TStringList的CommaText把我要的空白(ASCII碼32)和斷行給自動截掉了,我用Memo來檢測所讀到的資料,結果為 for (i=0;i < Str->Count;i++) { Memo1->Lines->Add(Str->Strings[i]); }
andychang1690
資深會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-23 17:36:45 IP:219.132.xxx.xxx 未訂閱
引言: 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
------
Andy Chang
koni
一般會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-23 19:09:18 IP:61.70.xxx.xxx 未訂閱
引言:
引言: 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
謝謝Andy你的方法,確實有用^^" 請教一下原理是什麻呢?為什麻(c[j] & 0x80)就可以知道是不是中文字呢? 麻煩嚕~多謝指教QQ"
andychang1690
資深會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-24 08:02:43 IP:219.130.xxx.xxx 未訂閱
引用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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-24 13:45:52 IP:61.70.xxx.xxx 未訂閱
感謝各位,了解了~謝謝嚕
系統時間:2024-04-16 14:10:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!