Невозможно записать объекты, содержащие строки в файл - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над проектом телефонной книги на 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 голосов
/ 20 ноября 2018

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

Но getData и showData на самом деле не принадлежат student.Я бы изменил его на void getStudent(std::istream & src, std::ostream & dest) и void showStudents(std::istream & src, std::ostream & dest), передав cin, cout и поток файлов из main.

0 голосов
/ 20 ноября 2018

Объект std::string - это, по сути, не более, чем обертка вокруг указателя (к реальному содержимому строки).Указатель уникален для каждого процесса и не может быть легко разделен между процессами даже в одной системе, даже процессами, выполняющими одну и ту же программу.

Чтобы вы могли читать или писать, пишите необработанный объект, напримервы делаете, объект должен быть тривиальным , который не является вашим объектом, так как он содержит нетривиальные std::string члены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...