C++类中包含string类型数据使用read和write实现文件读取和输出时遇到的问题

本人一渣,曾经遇到这样的问题:

类中包含string类型的数据,在使用read和write时,程序运行会崩溃。听学长介绍,string不是一整块内存都是字符串数据的,是有比较复杂的内存管理的,read进去不做处理是没什么问题,但是退出函数时定义的类的对象会析构,然后也会调用string类型数据的析构,这时候会导致内存混乱。想用getline函数解决这个问题,后来发现类中有int类型数据时会导致int后的数据在读取时出错。

打算将类中的string类型换成char类型,就可以解决这个问题,但是又觉得string类型用着比char要舒服,而且类已经写完,不想再改,所以采取一种折中的方法,在输出时采用一般的"file<<"的输出方法,只是在读取时,先按照char类型读取,再将char类型转换为string类型和int类型。

代码如下:

class Book_Number_Info
{
public:
    Book_Number_Info(){}
    Book_Number_Info(string isbn,string book_number,int status)
    {
        ISBN = isbn;
        Book_Number = book_number;
        Status = status;
    }
    void SetBook_Number(string book_number)
    {
        Book_Number = book_number;
    }
    void SetStatus(int status)
    {
        Status =  status;
    }
    string returnISBN()
    {
        return ISBN;
    }
    string returnBook_Number()
    {
        return Book_Number;
    }
    int returnStatus()
    {
        return Status;
    }
private:
    string ISBN;
    string Book_Number;
    int Status;
};



void NumberOut(string name)
{
    string filename = name + ".txt";
    ofstream file(filename.c_str(),ios_base::out);
    vector<Book_Number_Info>::iterator its;
    if(!file.is_open())
    {
        ypos++;     gotoxy(xpos,ypos);
        cout<<"#         文件输出失败!         #"<<endl;
        return ;
    }
    for(its=numberlist.begin();its!=numberlist.end();its++)
    {
        file<<(*its).returnISBN()<<endl;
        file<<(*its).returnBook_Number()<<endl;
        file<<(*its).returnStatus()<<endl;
    }
    vector<Book_Number_Info>(numberlist).swap(numberlist);
    //清空vector容器
    file.close();
    return;
}


void NumberIn(string name)
{
    string filename = name + ".txt";
    ifstream file;
    file.open(filename.c_str());
    if(!file.is_open())
    {
        ypos++;     gotoxy(xpos,ypos);
        cout<<"#         文件读取失败!         #"<<endl;
        return ;
    }
    char isbn[20],booknumber[20],status[5];
    string ISBN,Book_Number;
    int Status;
    while(true)
    {
        if(!file.getline(isbn,20))
            break;
        file.getline(booknumber,20);
        file.getline(status,5);
        ISBN = isbn;
        Book_Number = booknumber;
        Status = atoi(status);
        //atoi()函数用于将char类型转换为int类型,包含在头文件<stdlib.h>中
        Book_Number_Info temp(ISBN,Book_Number,Status);
        numberlist.push_back(temp);
    }
    file.close();
    return;
}



这是本人的方法,如果有别的方法,还请分享

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值