全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1225
推到 Plurk!
推到 Facebook!

如何讀取非ASCII資料到Memo or RichEdit 呢

尚未結案
Tacohsu
一般會員


發表:6
回覆:12
積分:8
註冊:2002-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-06 22:44:02 IP:218.160.xxx.xxx 未訂閱
小弟使用LoadFromFile方式讀取檔案到Memo or RichEdit,發現遇到有些非 Ascii資料會不見,該用什麼方式來讀取這類的檔案呢.
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-06 22:56:54 IP:140.135.xxx.xxx 未訂閱
Tacohsu您好:    
引言:LoadFromFile方式讀取檔案到Memo or RichEdit發現遇到有些非 Ascii資料會不見,該用什麼方式來讀取這類的檔案呢.
請問您是讀取什麼檔案呢?? 可考慮用TStringList或是用TMemoryStream來處理 TMemoryStream的用法可參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=24009 順心 <>~我也是在學習的階段,所以請您多多見諒與指教~ 發表人 -
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-07 00:02:03 IP:211.75.xxx.xxx 未訂閱
Tacohsu 你好,   你的意思是 非顯示的字元  看不到吧?!   LoadFromFile 是依據 carriage return or linefeed characters   來判斷是不是一行字串, 因此, 如果你的資料不是所謂的"字串"   那麼 當然 是會不見的, 那麼請用 一般讀檔的方式 或者   TMemoryStream 來讀取, 然後再依據你的應用來 scan 資料內容   當然這樣你就得麻煩點  需要逐字判讀  <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
Tacohsu
一般會員


發表:6
回覆:12
積分:8
註冊:2002-07-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-10 01:23:25 IP:61.228.xxx.xxx 未訂閱
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { unsigned char uc; char m_chCharacterText[1000000]; int kk=0; FILE *file; if (OpenDialog1->Execute()) { file=fopen(Form1->OpenDialog1->FileName.c_str(),"rb"); while(!feof(file)) { uc=fgetc(file); if((!feof(file))||(uc!=EOF)) { m_chCharacterText[kk]=uc; if( (m_chCharacterText[kk] == '\x00')||(m_chCharacterText[kk] == '\xFF') ) m_chCharacterText[kk] = '\x20'; kk ; } } fclose(file); } RichEdit1->Lines->Add(m_chCharacterText); } //--------------------------------------------------------------------------- 可是會出現RichEdit Line Insertion error 需要用什麼方式改進呢
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-10 02:21:39 IP:61.13.xxx.xxx 未訂閱
Tacohsu 你好,    不好意思這樣說, 不過你的程式出現了很多疑點喔    void __fastcall TForm1::Button2Click(TObject *Sender) { unsigned char uc; char m_chCharacterText[1000000]; // 這個變數宣告太大, // 應該會造成 stack 問題, 建議你用 heap memory int kk=0; FILE *file;    if (OpenDialog1->Execute()) { file=fopen(Form1->OpenDialog1->FileName.c_str(),"rb"); while(!feof(file)) { uc=fgetc(file); if((!feof(file))||(uc!=EOF)) // 有些判斷與檢查沒有必要, // 略去的話  程式會快點 { m_chCharacterText[kk]=uc;    // 這個判斷的意思是什麼呢..?  為什麼只挑 0x00 和 0xff 做處理呢??? // 如過是要判斷是否為 非Ascii資料?  可以使用 isascii(..) 函數, 相關 // 函數 可以在 ctype.h 裡找到 if( (m_chCharacterText[kk] == '\x00')||(m_chCharacterText[kk] == '\xFF') ) m_chCharacterText[kk] = '\x20'; kk++; } } fclose(file); }    // 因為前面有太多問題, 這裡當然是 不可預期了... :^) // 而 add 函數加入的字串(AnsiString)... 如果是一般字串 // 應該是要以 0x00 作結尾的一個連續記憶空間... 好啦, 上面 // 的程式片段, 你都把 0x00 處理掉了, 看不出你有最後指定 // 0x00 字元的地方, 所以這個所謂的字串轉成 AnsiString 是有問題地 // 另外, 你也可這樣指定 RichEdit1->Text = m_chCharacterText; RichEdit1->Lines->Add(m_chCharacterText);    }    想想我給你的建議吧  <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
系統時間:2024-05-03 10:17:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!