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

ReadFile與WriteFile得到的結果不同

尚未結案
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-30 22:07:39 IP:203.67.xxx.xxx 未訂閱
關於這個問題是這樣的.. 我利用CreateFile..ReadFile..WriteFile等函式做檔案存取的功能 請先見我的程式碼 
 
TMyClass myclass;
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  if(SaveDialog1->Execute()){
    HANDLE fh;
    DWORD written;
    fh=CreateFile(SaveDialog1->FileName.c_str(),GENERIC_WRITE,0,
                 NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(!WriteFile(fh,&myclass,sizeof(TMyClass),&written,NULL)){
      ShowMessage("Write file error");
    }           
    CloseHandle(fh);
  }
}    void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  if(OpenDialog1->Execute()){
    HANDLE fh;
    DWORD read;
    fh=CreateFile(OpenDialog1->FileName.c_str(),GENERIC_READ, 
               FILE_SHARE_READ,NULL,OPEN_EXISTING,
               FILE_ATTRIBUTE_NORMAL,NULL);
    if(!ReadFile(fh,&myclass,sizeof(TMyClass),&read,NULL)){
      ShowMessage("Read file error");
    }
    CloseHandle(fh);
  }
}
假設這個TMyClass是我自訂的物件..我想說利用這個方法來做存取的話.. 可以省下很多功夫..而且儲存的檔案都是亂碼一般人也看不懂..有保密的功用 但是卻經常有問題..寫好的檔案在讀出來的時候常常會當掉.. 就算幸運沒當..有的值卻不是寫進去的那個值.. 想請教各位..這到底是什麼問題..該怎麼辦才好.. 謝謝..
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-01 00:04:14 IP:203.204.xxx.xxx 未訂閱
可否將你的TMyClass如何定義po上來嗎?? 問題比較有可能是出在你如何定義TMyClass。
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-01 00:15:13 IP:203.67.xxx.xxx 未訂閱
引言: 可否將你的TMyClass如何定義po上來嗎?? 問題比較有可能是出在你如何定義TMyClass。
這..不太方便po上來耶.. 我以為這方法是適用任一種物件..?? 不過我物件有bool int float AnsiString 難道是因為AnsiString..?? 那我試著把AnsiString拿掉試試看.. 感謝您..也請各位再多給我點意見.. 謝謝..
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-01 08:56:25 IP:218.170.xxx.xxx 未訂閱
嗯問題出在你的AnsiString,這樣寫入檔案並不會寫入字串! 如果你要寫字串,可以定義一個char陣列來存放字串! 如果你還有使用指標的話,那你在寫入檔案並不會將該指標所指的內容寫入,而是會把位址寫入。 發表人 - liangnet 於 2004/07/01 09:04:19
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-01 09:31:49 IP:211.23.xxx.xxx 未訂閱
vittel 您好:    你的問題的確出在"不定記憶體大小"的AnsiString!! WriteFile 與 ReadFile 適用於任何 固定記憶體大小 的物件! 注意你在WriteFile時, myclass的AnsiString的記憶體大小可能不是0, 而myclass的AnsiString的初始長度是0 !! (請trace WriteFile 與 ReadFile 時, 你的sizeof(TMyClass)的大小。) 所以造成ReadFile時讀取錯誤。 建議你把AnsiString改成char[]形態,例如char buf[255]。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Anpinos Middle Earth http://anpino.hp.infoseek.co.jp/ -------------------------------
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-01 15:12:44 IP:211.76.xxx.xxx 未訂閱
vittel你好: 就像之前幾位版大說的,不只是AnsiString會出問題,只要你的myclass裡有指標的話,就一定會出錯(儲存一個指標,不代表儲存了指標所指向的東西) 另外,看起來你的TMyClass不是繼承自TObject...(但是用一個T當頭,看起來怪怪的...) 如果是的話,TObject的前4個byte的值是一個指向vitual method table的指標。這麼儲存也會出問題的。
vittel
一般會員


發表:13
回覆:14
積分:5
註冊:2003-09-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-02 01:47:00 IP:211.74.xxx.xxx 未訂閱
引言: vittel你好: 就像之前幾位版大說的,不只是AnsiString會出問題,只要你的myclass裡有指標的話,就一定會出錯(儲存一個指標,不代表儲存了指標所指向的東西) 另外,看起來你的TMyClass不是繼承自TObject...(但是用一個T當頭,看起來怪怪的...) 如果是的話,TObject的前4個byte的值是一個指向vitual method table的指標。這麼儲存也會出問題的。
剛開始用ReadFile的時候我也有想到..如果用指標的話.. 一定是指到沒意義的地方..所以我的資料型別也都宣告為變數.. 沒想到還是被AnsiString的盲點騙了..沒有星號就誤以為跟int float一樣 害我又傷腦筋想得好難過..現在是豁然開朗了.. 感謝各位的回答..我將AnsiString改成char陣列後就可以了.. 再次感謝各位的回應~~謝謝.. 我的TMyClass只是個舉例而已啦.. 實際上不是這個名字..也的確不是繼承自TObject.. 感謝pwipwi的提點..謝謝..
系統時間:2024-06-29 17:02:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!