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

請教一個TFileStream的問題

答題得分者是:m8815010
Samlee
一般會員


發表:13
回覆:12
積分:5
註冊:2002-07-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-19 09:35:38 IP:202.154.xxx.xxx 未訂閱
filestream := tfilestream.Create('E:\temp.dat',fmopenread); setLength(buffer,filestream.size); filestream.ReadBuffer(buffer[1],filestream.Size); filestream.Destroy; TFileStream去開啟一個檔案,但不懂的是為什麼ReadBuffer時,buffer不是從0開始.而是從1開始. 初學者.,請多包含 tks
sl@cableplus.com.cn
高階會員


發表:168
回覆:359
積分:130
註冊:2004-03-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-19 11:08:29 IP:218.80.xxx.xxx 未訂閱
去開啟一個檔案直接调用API的OPEN函数即可。
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-19 11:49:27 IP:61.63.xxx.xxx 未訂閱
引言: filestream := tfilestream.Create('E:\temp.dat',fmopenread); setLength(buffer,filestream.size); filestream.ReadBuffer(buffer[1],filestream.Size); filestream.Destroy; TFileStream去開啟一個檔案,但不懂的是為什麼ReadBuffer時,buffer不是從0開始.而是從1開始. 初學者.,請多包含 tks
Samlee你好: 試了一下,應該沒有一定要重 >!? 我的 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;iLines->Add(IntToHex(buf[i],2)); delete filestream; delete buf; } 還有誠如sl@cableplus.com.cn兄說的開檔沒有一定要用用樣開的,隨便怎樣開都行,自已最方便就為主! 另外你寫的是delphi嗎?我的是builder版的哦! All!
Samlee
一般會員


發表:13
回覆:12
積分:5
註冊:2002-07-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-19 11:59:49 IP:202.154.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-19 16:01:10 IP:61.63.xxx.xxx 未訂閱
引言: 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相同,但無法開啟. 感謝大家的指導 嘿嘿..沒事多研究一下.新的技巧.
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;bCnt***重要 if (pszBuffer[bCnt]==0x00) pszBuffer[bCnt]=0x99; } AnsiString SourceString; SourceString.sprintf(pszBuffer); IdBase64Encoder1->CodeString(SourceString); AnsiString EncodeString=IdBase64Encoder1->CompletedInput(); Fetch(EncodeString,";"); IdBase64Decoder1->CodeString(EncodeString); AnsiString DecodeString; DecodeString=IdBase64Decoder1->CompletedInput(); Fetch(DecodeString,";"); for (int bCnt=1;bCnt<=DecodeString.Length();bCnt ) { if ((BYTE)DecodeString[bCnt]==0x99) ***重要 //DecodeString[bCnt]=0x00; pszBuffer[bCnt-1]=0x00; //Modified //pszBuffer[bCnt-1]=(byte)DecodeString[bCnt]; } iFileHandle=FileCreate(newfilename); if (iFileHandle!=0) { FileWrite(iFileHandle,pszBuffer,iBytesRead); FileClose(iFileHandle); } delete [] pszBuffer; 程式中遇到buffer內有值0x00的話,是先把它轉成0x99,最後encode、decode完成後再轉回來,再存檔!也就是要先避過0x00這樣的數值! 那當然轉成0x99只是隨便取的,只要這個檔內原本沒有0x99就不會混淆了! 方式未必最好,精神是這樣就是了! All,參著參著! 發表人 -
Samlee
一般會員


發表:13
回覆:12
積分:5
註冊:2002-07-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-19 22:04:12 IP:210.64.xxx.xxx 未訂閱
謝謝版主的指導,還特地寫了一個sample 雖然有些地方還不是很懂. 例如為什麼開檔要用byte,若用char會比較危險. 藉這個問題.我又深深的感到自己的不足... 總而言之.一言蔽之. 我又學到不少. 哈哈.成長空間真大.
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-20 09:50:28 IP:61.63.xxx.xxx 未訂閱
引言: 謝謝版主的指導,還特地寫了一個sample 雖然有些地方還不是很懂. 例如為什麼開檔要用byte,若用char會比較危險. 藉這個問題.我又深深的感到自己的不足... 總而言之.一言蔽之. 我又學到不少. 哈哈.成長空間真大. < face="Verdana, Arial, Helvetica"> Samlee你好: 因為我也沒用過那兩個 >! 另外開檔儘量用 >!
Samlee
一般會員


發表:13
回覆:12
積分:5
註冊:2002-07-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-20 11:19:58 IP:202.154.xxx.xxx 未訂閱
請問版主呀. 雖然透過Sample後,得到的newfile和原始檔案size一樣. 但無法開啟新的file耶. 我測試的檔案是word檔. ps.用base64應該是什麼檔案都可以序列化(可視) 還有什麼地方是沒注意到的嗎.
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-20 13:04:47 IP:61.63.xxx.xxx 未訂閱
引言: 請問版主呀. 雖然透過Sample後,得到的newfile和原始檔案size一樣. 但無法開啟新的file耶. 我測試的檔案是word檔. ps.用base64應該是什麼檔案都可以序列化(可視) 還有什麼地方是沒注意到的嗎.
Samlee你好: 檔案大小一致是正常的,不論結果對不對,所以判斷檔案大小是 >! 最後 >!
系統時間:2024-06-01 23:23:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!