請教一個TFileStream的問題 |
答題得分者是:m8815010
|
Samlee
一般會員 發表:13 回覆:12 積分:5 註冊:2002-07-28 發送簡訊給我 |
|
sl@cableplus.com.cn
高階會員 發表:168 回覆:359 積分:130 註冊:2004-03-26 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: filestream := tfilestream.Create('E:\temp.dat',fmopenread); setLength(buffer,filestream.size); filestream.ReadBuffer(buffer[1],filestream.Size); filestream.Destroy; TFileStream去開啟一個檔案,但不懂的是為什麼ReadBuffer時,buffer不是從0開始.而是從1開始. 初學者.,請多包含 tksSamlee你好: 試了一下,應該沒有一定要重 >!? 我的 class="code"> void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString filename="C:\\test.test"; TFileStream* filestream=new TFileStream(filename,fmOpenRead); int size=filestream->Size; BYTE *buf=new BYTE[size]; filestream->ReadBuffer(buf,size); for (int i=0;i |
Samlee
一般會員 發表:13 回覆:12 積分:5 註冊:2002-07-28 發送簡訊給我 |
sorry,sorry,,,
我也是bulider啦.只是從別的地方找到相對應的code.一時沒注意就給他post了.
其實用這種方式開檔.我是在研究base64.我把code再post一次
char* Bu; TFileStream *fs=new TFileStream("c:\\temp\\00050.ico", (WORD)fmOpenRead); Bu=new char[fs->Size]; memset(Bu,0,fs->Size); fs->Read((void*)(Bu),fs->Size); IdBase64Encoder1->CodeString(Bu); AnsiString ss=IdBase64Encoder1->CompletedInput(); Memo2->Lines->Add(ss); Fetch(ss,";"); IdBase64Decoder1->CodeString(ss); memset(Bu,0,fs->Size); ss=IdBase64Decoder1->CompletedInput(); Fetch(ss,";"); memcpy(Bu,ss.c_str(),ss.Length()); TFileStream *s1=new TFileStream("c:\\temp\\00051.ico",(WORD)fmCreate); s1->WriteBuffer(Bu,fs->Size); delete s1;我的問題有幾點. 1.為什麼在encode後,所得到的String第一二位.均是0;這代表的是什麼 2.我在Decode後.所存下的檔.大小均與source相同,但無法開啟. 感謝大家的指導 嘿嘿..沒事多研究一下.新的技巧. |
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: sorry,sorry,,, 我也是bulider啦.只是從別的地方找到相對應的code.一時沒注意就給他post了. 其實用這種方式開檔.我是在研究base64.我把code再post一次Samlee你好: 嗯,瞭解你的問題了,跟你一開始 >! 再來你寫的 >! < class="code"> 1. TFileStream物件只是為了開檔,似乎是繞了一圈沒錯! 2. 整個問題並不是在TFileStream的問題 2. 開檔應是儘使用 BYTE、unsigned char,用char宣告buffer比較危險! 3. 另外我查了一下,Builder的那兩個encode、decode的元件是吃AnsiString的data 哦,而你是餵整個file,還是binary的file! 4. 硬要餵一整個binary file去做encode、decode也可以,只是要concern很多地方! 我的做法: 1. 一樣先開檔,方式就隨便了! 2. 將開完檔後得到的buffer,轉成AnsiString!(這裏有問題,特別說明:) 由於開的是binary檔,所以得到的buffer裏面會有0x00的值, 0x00轉成AnsiString會死,所以要特別處理! 3. 得到的AnsiString才能再做encode、decode的步驟! 4. 做完encode、decode的AnsiString再存成新檔! Example: AnsiString filename="C:\\temp\\cygwin.ico"; AnsiString newfilename="C:\\temp\\new.ico"; int iFileHandle; int iFileLength; int iBytesRead; BYTE *pszBuffer; try { iFileHandle=FileOpen(filename,fmOpenRead); iFileLength=FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); pszBuffer=new BYTE[iFileLength 1]; iBytesRead=FileRead(iFileHandle,pszBuffer,iFileLength); FileClose(iFileHandle); } catch (...) { ShowMessage("檔案開啟有誤!"); } for (int bCnt=0;bCntchar* Bu; TFileStream *fs=new TFileStream("c:\\temp\\00050.ico", (WORD)fmOpenRead); Bu=new char[fs->Size]; memset(Bu,0,fs->Size); fs->Read((void*)(Bu),fs->Size); IdBase64Encoder1->CodeString(Bu); AnsiString ss=IdBase64Encoder1->CompletedInput(); Memo2->Lines->Add(ss); Fetch(ss,";"); IdBase64Decoder1->CodeString(ss); memset(Bu,0,fs->Size); ss=IdBase64Decoder1->CompletedInput(); Fetch(ss,";"); memcpy(Bu,ss.c_str(),ss.Length()); TFileStream *s1=new TFileStream("c:\\temp\\00051.ico",(WORD)fmCreate); s1->WriteBuffer(Bu,fs->Size); delete s1;我的問題有幾點. 1.為什麼在encode後,所得到的String第一二位.均是0;這代表的是什麼 2.我在Decode後.所存下的檔.大小均與source相同,但無法開啟. 感謝大家的指導 嘿嘿..沒事多研究一下.新的技巧. |
Samlee
一般會員 發表:13 回覆:12 積分:5 註冊:2002-07-28 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
|
Samlee
一般會員 發表:13 回覆:12 積分:5 註冊:2002-07-28 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |