如何从对象打印字符串?

How to print a string from an object?

我尝试了以下代码将对象写入 dat 文件:

#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.dat”中得到了一些垃圾值 文件。我正在创建一个数据库并想获取记录,但我无法获取 dat 文件中的所有记录。

请提出解决方案

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

解决方案是serialization/deserialization。

这听起来很复杂,但在您的情况下一点也不复杂。这基本上意味着您的结构中的所有数据都应转换为纯文本并放入文本文件中。

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

默认方法是覆盖插入器 << 运算符和提取器 >> 运算符。

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

#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;
}