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.