本人一渣,曾经遇到这样的问题:
类中包含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;
}
这是本人的方法,如果有别的方法,还请分享