C++ C中从文件加载结构时的分段错误
我在玩C/的fopen()和putc()函数,想实现结构的序列化/反序列化。然而,这里出现了一些“分段错误”错误。我调查了类似的问题,发现当我试图访问一些不属于我的记忆时,这种情况就会发生 我应该在代码中修改什么才能使其正常工作C++ C中从文件加载结构时的分段错误,c++,C++,我在玩C/的fopen()和putc()函数,想实现结构的序列化/反序列化。然而,这里出现了一些“分段错误”错误。我调查了类似的问题,发现当我试图访问一些不属于我的记忆时,这种情况就会发生 我应该在代码中修改什么才能使其正常工作 struct Account { string holder_name; string holder_password; double current_sum; }; int save_to_file(Account * account); Account * loa
struct Account {
string holder_name;
string holder_password;
double current_sum;
};
int save_to_file(Account * account);
Account * load_from_file(string holder_name);
int main(){
Account account = { "BEN", "password", 200.0 };
save_to_file(&account);
load_from_file("BEN");
return 0;
}
int save_to_file(Account * account){
const char * cstr = account->holder_name.c_str();
int size = sizeof(struct Account);
FILE * fp = fopen(cstr, "wb");
char * c;
c = (char *) account;
for(int i=0; i < size; i++)
{
putc(*c++, fp);
}
return fclose(fp);
}
Account * load_from_file(string holder_name)
{
FILE * fp;
char *c;
int i;
int size = sizeof(struct Account);
struct Account * ptr = (struct Account *) malloc(sizeof(struct Account));
if ((fp = fopen(holder_name.c_str(), "rb")) == NULL)
{
perror("Error occured while opening file");
return NULL;
}
c = (char *)ptr;
while ((i = getc(fp))!=EOF)
{
*c = i;
c++;
}
fclose(fp);
return ptr;
}
struct帐户{
字符串持有者名称;
字符串持有者的密码;
双电流和;
};
int保存到文件(帐户*帐户);
帐户*从\u文件加载\u(字符串持有者\u名称);
int main(){
帐户={“BEN”,“password”,200.0};
将_保存到_文件(&帐户);
从_文件(“BEN”)加载_;
返回0;
}
int保存到文件(帐户*帐户){
const char*cstr=account->holder_name.c_str();
int size=sizeof(结构帐户);
文件*fp=fopen(cstr,“wb”);
char*c;
c=(字符*)账户;
对于(int i=0;i <代码> > p>字符串类型不属于C语言,它是C++的一个对象。
因为它可以通过对象内部的指针实现,所以不能简单地将它们的二进制值写入文件:当您稍后读取文件时,不会分配指向的内存
一个简单的规则是,将指针值写入文件可能是一个错误
要使代码正常工作,只需将字符串
类型替换为char[]
。以下是仅作此修改的代码:
#include <stdlib.h>
#include <stdio.h>
struct Account {
char holder_name[100];
char holder_password[100];
double current_sum;
};
int save_to_file(struct Account * account);
struct Account * load_from_file(char *holder_name);
int main(){
struct Account account = { "BEN", "password", 200.0 };
save_to_file(&account);
load_from_file("BEN");
return 0;
}
int save_to_file(struct Account * account){
const char * cstr = account->holder_name;
int size = sizeof(struct Account);
FILE * fp = fopen(cstr, "wb");
char * c;
c = (char *) account;
for(int i=0; i < size; i++)
{
putc(*c++, fp);
}
return fclose(fp);
}
struct Account * load_from_file(char *holder_name)
{
FILE * fp;
char *c;
int i;
int size = sizeof(struct Account);
struct Account * ptr = (struct Account *) malloc(sizeof(struct Account));
if ((fp = fopen(holder_name, "rb")) == NULL)
{
perror("Error occured while opening file");
return NULL;
}
c = (char *)ptr;
while ((i = getc(fp))!=EOF)
{
*c = i;
c++;
}
fclose(fp);
return ptr;
}
#包括
#包括
结构帐户{
字符持有者名称[100];
字符持有者_密码[100];
双电流和;
};
int保存到文件(结构帐户*帐户);
结构帐户*从\u文件加载\u(字符*持有人\u名称);
int main(){
结构帐户={“BEN”,“password”,200.0};
将_保存到_文件(&帐户);
从_文件(“BEN”)加载_;
返回0;
}
int保存到文件(结构帐户*帐户){
const char*cstr=账户->持有人名称;
int size=sizeof(结构帐户);
文件*fp=fopen(cstr,“wb”);
char*c;
c=(字符*)账户;
对于(int i=0;i <代码> >选择一个语言<代码>。cString()/Cuff>是C++ <代码> STD::String 运算符。请提问,告诉我们您做了什么样的调试。我希望您已经在Valgrind或类似的检查器中运行了自己的代码,并且已经使用诸如GDB之类的调试器进行了调查。确保还启用了一整套编译器警告。这些工具告诉了你什么,它们遗漏了什么信息?并阅读Eric Lippert的。您可能希望使用格式化I/O(即
),而不是尝试复制类型的存储,例如std::string
。在C++代码中,更喜欢<代码>新< /COD>和<代码>删除<代码> > <代码> MalCube()> <代码>和<代码> For()/<代码>。