无法将包含字符串的对象写入文件

时间:2018-11-20 15:04:30

标签: c++ c++11

我正在使用C ++进行电话簿项目。我做了一个类,里面有字符串对象来存储一些字符串。

我的程序无法将字符串数据写入文件,并困扰着我。它只会显示最后插入的数据。

这里是示例程序,提供了我想做什么以及问题出在哪里的基本想法。

#include <iostream>
#include <fstream>
using namespace std;

class student {
private:
    string name;    
    int age;    
    string mail;
public:
    void getData(student &s) {
        ofstream file;
        file.open("file.txt", ios::app);
        if(!file) {
            cout << "Error in creating file.." << endl;
            return;
        }
        cout << "\nFile created successfully." << endl;

        cout << "Enter name:    ";
        cin.ignore(); 
        getline(cin, name);

        cout << "Enter age:     ";
        cin >> age;

        cout<<"Enter mail:    ";
        cin.ignore(); 
        getline(cin, mail);

        file.write((char*)&s, sizeof(s));
        file.close();

        cout << "\nFile saved and closed succesfully." << endl;
    }
    void showData(student &s) {
        ifstream file1;
        file1.open("file.txt", ios::in);
        if(!file1){
            cout<<"Error in opening file..";
            return;
        }
        while(!file1.eof()){
             file1.read((char*) &s, sizeof(s));
             cout << "Name: " <<name << "\nAge : " << age << "\nMail: "<< mail << endl; 
        }
        file1.close();
    }
};
int main() {
    student s;
    s.getData(s);
    s.getData(s);
    s.getData(s);
    s.showData(s);
    return 0;
}

在这种情况下,我需要帮助。

Output Image

2 个答案:

答案 0 :(得分:2)

std::string对象基本上不过是指针(指向实际字符串内容)的包装。指针对于每个进程都是唯一的,即使在同一系统上,甚至在运行同一程序的进程之间,也无法轻易在各个进程之间共享指针。

要像您一样能够读写原始对象,该对象必须为trivial,因为您的对象包含非平凡的std::string成员,所以该对象不是

答案 1 :(得分:0)

std::ifstream提供与std::cin相同的接口,而std::ofstream提供与std::cout相同的接口。您可以使用函数读取和写入适当的流,而不必复制表示对象的字节。

class student {
private:
    string name;
    int age;    
    string mail;
public:
    void getData();
    void showData();
};

std::istream& operator >> (std::istream& is, const student & s)
{
    is.ignore(); std::getline(is, s.name);
    is >> s.age;
    is.ignore(); std::getline(is, s.mail);
    return is;
}

std::ostream& operator << (std::ostream& os, const student & s)
{
    return os << s.name << s.age << s.mail;
}

您也不需要将对象传递给它自己的方法。您使用成员,然后读取或写入通过的学生。

void student::getData() {
    std::ofstream file("file.txt",ios::app);
    if(!file) {
        std::cout << "Error in creating file.." << std::endl;
        return;
    }
    std::cout << "\nFile created successfully." << std::endl;

    std::cout << "Enter name:    ";
    std::cin.ignore(); 
    std::getline(std::cin, name);

    std::cout << "Enter age:     ";
    std::cin >> age;

    std::cout << "Enter mail:    ";
    std::cin.ignore(); 
    std::getline(std::cin, mail);

    file << *this;
    std::cout << "\nFile saved and closed succesfully." << std::endl;
}

void student::showData() {
    ifstream file1("file.txt", ios::in);
    if(!file1){
        std::cout << "Error in opening file..";
        return;
    }
    while(file1 >> *this){
         std::cout << "Name: " << name << "\nAge : " << age << "\nMail: " << mail << std::endl; 
    }
}

int main() {
    student s;
    s.getData();
    s.getData();
    s.getData();
    s.showData();
    return 0;
}

但是getDatashowData并不真正属于student。我将其更改为void getStudent(std::istream & src, std::ostream & dest)void showStudents(std::istream & src, std::ostream & dest),并传入cincout和main中的文件流。