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

請問這樣的存檔方式為何錯誤

答題得分者是:RaynorPao
ruwill
一般會員


發表:33
回覆:31
積分:12
註冊:2002-11-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-21 16:01:18 IP:210.68.xxx.xxx 未訂閱
我檢查我的存檔方法,應該都沒錯但是有時會出現access violation ,而且資料檔案有建立,但是卻無法正確讀取檔案,我的程式碼如下 void __fastcall TForm1::Button1Click(TObject *Sender) { struct { String SaveDataPath,MachineName; }MachineData; FILE *FP; if((FP=fopen("c:\\winnt\\system32\\OpenShortPath1.dat","rb"))==NULL) { ShowMessage("it can't open file "); } else { fread(&MachineData,sizeof(MachineData),1,FP); fclose(FP); Edit1->Text=MachineData.SaveDataPath; Edit2->Text=MachineData.MachineName; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { FILE *fp1; struct { String SaveDataPath,MachineName; }MachineData; MachineData.SaveDataPath="testww"; MachineData.MachineName="ererfd"; if((fp1=fopen("c:\\winnt\\system32\\OpenShortPath1.dat","wb"))==NULL) { ShowMessage("the file can not open"); fclose(fp1); } else { fwrite(&MachineData,sizeof(MachineData),1,fp1); fclose(fp1); } }
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-21 16:35:31 IP:203.73.xxx.xxx 未訂閱
引言: 我檢查我的存檔方法,應該都沒錯但是有時會出現access violation ,而且資料檔案有建立,但是卻無法正確讀取檔案
ruwill 你好:
以下是我的建議~~給你做參考
(>>>>>>>>>>>    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-22 04:58:56 IP:61.216.xxx.xxx 未訂閱
ruwill 你好:  我想你可以按照 RaynorPao 的方式來處理問題,   不過我想還是得釐清你的問題.     猜想你的執行步驟是  先執行Button2Click 再執行 Button1Click吧  我想 Button2Click 不會有你說的那個錯誤, 錯誤是發生在  Button1Click的這麼程式段裏    {     fread(&MachineData,sizeof(MachineData),1,FP); // 錯誤源頭     fclose(FP);     Edit1->Text=MachineData.SaveDataPath; // 存取錯誤     Edit2->Text=MachineData.MachineName; // 存取錯誤    }  因為 sizeof(MachineData) 的長度不是你要讀出資料的長度,  &MachineData 也不該 是你存字串資料的位址.  你可以想想怎麼改, 應該就會對了 
------
不要忘記呼吸,不要忘記編程! ∩__∩
ruwill
一般會員


發表:33
回覆:31
積分:12
註冊:2002-11-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-22 09:12:39 IP:210.68.xxx.xxx 未訂閱
感謝各位的幫忙,我想我的問題應該出現在我的結構中出現的這種資料型態String ,所以我更改以下程式就可執行,供大家參考 void __fastcall TForm1::Button1Click(TObject *Sender) { struct { char SaveDataPath[40],MachineName[40]; }MachineData; FILE *FP; if((FP=fopen("c:\\winnt\\system32\\OpenShortPath1.dat","rb"))==NULL) { ShowMessage("it can't open file "); } else { fread(&MachineData,sizeof(MachineData),1,FP); fclose(FP); Edit1->Text=AnsiString(MachineData.SaveDataPath); Edit2->Text=AnsiString(MachineData.MachineName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { FILE *fp1; struct { char SaveDataPath[40],MachineName[40]; }MachineData; strcpy(MachineData.SaveDataPath,Edit1->Text.c_str()); strcpy(MachineData.MachineName,Edit2->Text.c_str()); if((fp1=fopen("c:\\winnt\\system32\\OpenShortPath1.dat","wb"))==NULL) { ShowMessage("the file can not open"); fclose(fp1); } else { fwrite(&MachineData,sizeof(MachineData),1,fp1); fclose(fp1); } }
ruwill
一般會員


發表:33
回覆:31
積分:12
註冊:2002-11-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-22 09:25:36 IP:210.68.xxx.xxx 未訂閱
引言:
引言: 我檢查我的存檔方法,應該都沒錯但是有時會出現access violation ,而且資料檔案有建立,但是卻無法正確讀取檔案
ruwill 你好:
以下是我的建議~~給你做參考
(>>>>>>>>>>>    -- >< face="Verdana, Arial, Helvetica">    抱歉請問一下,如果要用c library,是要如何對記憶體作處理,聽起來很抽象,很難理解,可否幫忙再一次說明     
        
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-22 09:48:55 IP:203.73.xxx.xxx 未訂閱
引言: 抱歉請問一下,如果要用c library,是要如何對記憶體作處理,聽起來很抽象,很難理解,可否幫忙再一次說明
ruwill 你好:
請參考以下的說明
(>
備註:
(
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
ruwill
一般會員


發表:33
回覆:31
積分:12
註冊:2002-11-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-22 10:30:04 IP:210.68.xxx.xxx 未訂閱
引言: ruwill 你好: 我想你可以按照 RaynorPao 的方式來處理問題, 不過我想還是得釐清你的問題. 猜想你的執行步驟是 先執行Button2Click 再執行 Button1Click吧 我想 Button2Click 不會有你說的那個錯誤, 錯誤是發生在 Button1Click的這麼程式段裏 { fread(&MachineData,sizeof(MachineData),1,FP); // 錯誤源頭 fclose(FP); Edit1->Text=MachineData.SaveDataPath; // 存取錯誤 Edit2->Text=MachineData.MachineName; // 存取錯誤 } 因為 sizeof(MachineData) 的長度不是你要讀出資料的長度, &MachineData 也不該 是你存字串資料的位址. 你可以想想怎麼改, 應該就會對了 < face="Verdana, Arial, Helvetica"> 感謝你的解釋,只是還是想不通要如何改才會有正確的方式,可否幫忙賜教,萬分感謝,雖然我用另一種方式來解,是可行的,但還是很想知道要如何更改像這樣的錯誤,最後謝謝你
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-01-22 13:34:33 IP:61.59.xxx.xxx 未訂閱
ruwill 你好,   那我就試著幫你找個方法, 解決這個問題.   方法很直接, 所以會有一些問題, 不過要看你的問題的複雜度如何了,   你的問題是 寫入與讀取字串, 不過你原來的寫法   只會寫出 MachineData.SaveDataPath 或 .MachineName 等記憶空間   位址之後的資料, 而讀出部分則將字串值寫入上述記憶空間 這當然會   有問題. 所以你需知道 要輸出入資料的長度 以作為輸出控制.   我幫你想一個解決方式如下:    struct { String SaveDataPath,MachineName; }MachineData;    FILE *FP; if((FP=fopen("OpenShortPath1.dat","rb"))==NULL) { ShowMessage("it can't open file "); } else { //fread(&MachineData,sizeof(MachineData),1,FP); char vBuf[256]; // 當字串超過 255 長度時, 你必須修改緩衝區空間大小 fgets(vBuf, 256, FP); MachineData.SaveDataPath = vBuf; fgets(vBuf, 256, FP); MachineData.MachineName = vBuf; fclose(FP); Edit1->Text=MachineData.SaveDataPath; Edit2->Text=MachineData.MachineName; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { FILE *fp1; struct { String SaveDataPath,MachineName; }MachineData; MachineData.SaveDataPath="testww"; MachineData.MachineName="ererfd"; if((fp1=fopen("OpenShortPath1.dat","wb"))==NULL) { ShowMessage("the file can not open"); fclose(fp1); } else { //fwrite(&MachineData,sizeof(MachineData),1,fp1); fprintf(fp1, "%s\n", MachineData.SaveDataPath.c_str()); fprintf(fp1, "%s\n", MachineData.MachineName.c_str()); fclose(fp1); } } 這只是依個可以運行的方式, 了解你小小錯誤的原因, 繞個路 就會是個 好方法了
------
不要忘記呼吸,不要忘記編程! ∩__∩
系統時間:2024-04-26 12:05:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!