如何从对象打印字符串?



我尝试用下面的代码将对象写入数据文件:

#include<iostream>
#include<fstream>
#include<string>
#include<string.h>
using namespace std;
class Student
{ //data members
int adm;
string name;
public:
Student()
{
adm = 0;
name = "";
}
Student(int a,string n)
{
adm = a;
name = n;
}
Student setData(Student st) //member function
{
cout << "nEnter admission no. ";
cin >> adm;
cout << "Enter name of student ";
cin.ignore();
getline(cin,name);
st = Student(adm,name);
return st;
}
void showData()
{
cout << "nAdmission no. : " << adm;
cout << "nStudent Name : " << name;
}
int retAdmno()
{
return adm;
}
};
/*
* function to write in a binary file.
*/
void demo()
{
ofstream f;
f.open("student.dat",ios::binary);
for(int i = 0;i<4;i++)
{
Student st;
st = st.setData(st);
f.write((char*)&st,sizeof(st));
}
f.close();
ifstream fin;
fin.open("student.dat",ios::binary);
Student st;
while(!fin.eof())
{
fin.read((char*)&st,sizeof(st));
st.showData();
}
}
int main()
{
demo();
return 0;
}

但是当我执行演示函数时,我从"student. date "文件。我正在创建一个数据库,并希望获得记录,但我无法获得数据文件中的所有记录。

请提出解决方案

不能以二进制方式写入复杂的数据类型。它们里面有一些额外的变量和函数,你不知道也看不到。这些数据类型有一些依赖于上下文的内部状态。因此,您不能以二进制形式存储,然后在其他地方重用它。那是行不通的。

解决方案是序列化/反序列化。

这听起来很复杂,但对你来说一点也不复杂。它基本上意味着所有来自结构体的数据都应转换为纯文本并放入文本文件中。

对于回读数据,它将首先作为文本读取,然后转换为内部数据结构。

默认的方法是覆盖插入<<操作符和提取>>操作符。

查看修改后代码中的简单示例:

#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>

class Student
{ //data members
int adm;
std::string name;
public:
Student()
{
adm = 0;
name = "";
}
Student(int a, std::string n)
{
adm = a;
name = n;
}
Student setData(Student st) //member function
{
std::cout << "nEnter admission no. ";
std::cin >> adm;
std::cout << "Enter name of student ";

std::getline(std::cin>> std::ws, name);
st = Student(adm, name);
return st;
}
void showData()
{
std::cout << "nAdmission no. : " << adm;
std::cout << "nStudent Name : " << name;
}
int retAdmno()
{
return adm;
}
friend std::ostream& operator << (std::ostream& os, const Student& s) {
return os << s.adm << 'n' << s.name << 'n';
}
friend std::istream& operator >> (std::istream& is, Student& s) {
return std::getline(is >> s.adm >> std::ws, s.name);
}
};
/*
* function to write in a binary file.
*/
void demo()
{
std::ofstream f("student.dat");
for (int i = 0; i < 4; i++)
{
Student st;
st = st.setData(st);
f << st;
}
f.close();
std::ifstream fin("student.dat");
Student st;
while (!fin.eof())
{
fin >> st;
st.showData();
}
}
int main()
{
demo();
return 0;
}

最新更新