C++ C中从文件加载结构时的分段错误

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

我在玩C/的fopen()和putc()函数,想实现结构的序列化/反序列化。然而,这里出现了一些“分段错误”错误。我调查了类似的问题,发现当我试图访问一些不属于我的记忆时,这种情况就会发生

我应该在代码中修改什么才能使其正常工作

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()/<代码>。