如何讀取非ASCII資料到Memo or RichEdit 呢 |
尚未結案
|
Tacohsu
一般會員 發表:6 回覆:12 積分:8 註冊:2002-07-18 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
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 發送簡訊給我 |
Tacohsu 你好,
你的意思是 非顯示的字元 看不到吧?!
LoadFromFile 是依據 carriage return or linefeed characters
來判斷是不是一行字串, 因此, 如果你的資料不是所謂的"字串"
那麼 當然 是會不見的, 那麼請用 一般讀檔的方式 或者
TMemoryStream 來讀取, 然後再依據你的應用來 scan 資料內容
當然這樣你就得麻煩點 需要逐字判讀
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
Tacohsu
一般會員 發表:6 回覆:12 積分:8 註冊:2002-07-18 發送簡訊給我 |
//--------------------------------------------------------------------------- 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 發送簡訊給我 |
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); } 想想我給你的建議吧
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |