C++中从文件中读取对象数据的问题
Problem in reading data of object from file in c++
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
class student{
private:
string name;
long int rollNo;
public:
static int noOfStudent;
void getData(){
cout<<"Enter name:";
getline(cin,name);
cout<<"Enter Roll No:";
cin>>rollNo;
}
void storeInFile(){
ofstream myfile;
myfile.open("studentDataBase.txt",ios::app|ios::binary);
if(myfile.fail())
exit(-1);
myfile.write((char*)this,sizeof(*this));
myfile.close();
}
void printData(){
ifstream myfile;
myfile.open("studentDataBase.txt",ios::binary);
if(myfile.fail())
exit(-1);
myfile.read((char *)this,sizeof(*this));
while(!myfile.eof()){
cout<<this->name<<" "<<this->rollNo<<"\n";
myfile.read((char *)this,sizeof(*this));
}
myfile.close();
}
};
int student::noOfStudent;
int main()
{
student st[100];
st[0].getData();
st[0].storeInFile();
st[0].printData();
}
这是用于将学生的姓名和学号存储在文件中并从文件中读取以打印学生详细信息的代码。
但是在从文件中读取数据和打印 it.When i 运行 这个程序时出现问题,
并输入学生的详细信息,然后调用 printData() 函数,然后这个程序就可以完美运行了。
但是当我再次 运行 这个程序并尝试只调用 printData() 函数时,在输出中,一些垃圾值 shown.I 无法理解为什么会这样?
(非常抱歉代码太长)
我不建议这样做:
myfile.write((char*)this,sizeof(*this));
因为你的 student
class 不是 POD. Here 解释了为什么使用 POD 它可能会起作用。
您正在将程序内存 space 中的(在您的情况下分配的堆栈)内存写入文件。稍后再读回是未定义的行为。如果您想将 student
class 保存到文件(即序列化您的 student
class),请写入相应的数据,例如 "name" 和 "rollNo",例如:在 ASCII 模式下为 myfile << name;
,在二进制模式下为 myfile.write(name.c_str(), name.size());
。或者更好的是,使用一些好的序列化工具。我可以推荐 boost serialization.
我建议用空格分隔的文本编写数据:
myFile << rollNo << " " << name << "\n";
这将允许您像这样读回它:
myFile >> rollNo;
std::getline(myFile, name);
std::getline
用于帮助同步每行一条记录并允许学生姓名中有空格。
编辑 1:二进制写入
如果一定要用二进制方式写的话,我推荐在正文后面写文字的长度:
myFile.write((char *) &rollno, sizeof(rollno));
unsigned int length = name.length();
myFile.write((char *) &length, sizeof(length));
myFile.write(name.c_str(), length);
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
class student{
private:
string name;
long int rollNo;
public:
static int noOfStudent;
void getData(){
cout<<"Enter name:";
getline(cin,name);
cout<<"Enter Roll No:";
cin>>rollNo;
}
void storeInFile(){
ofstream myfile;
myfile.open("studentDataBase.txt",ios::app|ios::binary);
if(myfile.fail())
exit(-1);
myfile.write((char*)this,sizeof(*this));
myfile.close();
}
void printData(){
ifstream myfile;
myfile.open("studentDataBase.txt",ios::binary);
if(myfile.fail())
exit(-1);
myfile.read((char *)this,sizeof(*this));
while(!myfile.eof()){
cout<<this->name<<" "<<this->rollNo<<"\n";
myfile.read((char *)this,sizeof(*this));
}
myfile.close();
}
};
int student::noOfStudent;
int main()
{
student st[100];
st[0].getData();
st[0].storeInFile();
st[0].printData();
}
这是用于将学生的姓名和学号存储在文件中并从文件中读取以打印学生详细信息的代码。 但是在从文件中读取数据和打印 it.When i 运行 这个程序时出现问题, 并输入学生的详细信息,然后调用 printData() 函数,然后这个程序就可以完美运行了。 但是当我再次 运行 这个程序并尝试只调用 printData() 函数时,在输出中,一些垃圾值 shown.I 无法理解为什么会这样? (非常抱歉代码太长)
我不建议这样做:
myfile.write((char*)this,sizeof(*this));
因为你的 student
class 不是 POD. Here 解释了为什么使用 POD 它可能会起作用。
您正在将程序内存 space 中的(在您的情况下分配的堆栈)内存写入文件。稍后再读回是未定义的行为。如果您想将 student
class 保存到文件(即序列化您的 student
class),请写入相应的数据,例如 "name" 和 "rollNo",例如:在 ASCII 模式下为 myfile << name;
,在二进制模式下为 myfile.write(name.c_str(), name.size());
。或者更好的是,使用一些好的序列化工具。我可以推荐 boost serialization.
我建议用空格分隔的文本编写数据:
myFile << rollNo << " " << name << "\n";
这将允许您像这样读回它:
myFile >> rollNo;
std::getline(myFile, name);
std::getline
用于帮助同步每行一条记录并允许学生姓名中有空格。
编辑 1:二进制写入
如果一定要用二进制方式写的话,我推荐在正文后面写文字的长度:
myFile.write((char *) &rollno, sizeof(rollno));
unsigned int length = name.length();
myFile.write((char *) &length, sizeof(length));
myFile.write(name.c_str(), length);