請問這樣的存檔方式為何錯誤 |
答題得分者是:RaynorPao
|
ruwill
一般會員 發表:33 回覆:31 積分:12 註冊:2002-11-01 發送簡訊給我 |
我檢查我的存檔方法,應該都沒錯但是有時會出現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 發送簡訊給我 |
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
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 發送簡訊給我 |
感謝各位的幫忙,我想我的問題應該出現在我的結構中出現的這種資料型態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 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
|
ruwill
一般會員 發表:33 回覆:31 積分:12 註冊:2002-11-01 發送簡訊給我 |
引言: 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 發送簡訊給我 |
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);
} } 這只是依個可以運行的方式, 了解你小小錯誤的原因,
繞個路 就會是個 好方法了
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |