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