C/C++

Перегрузка операторов ввода-вывода для файловых потоков

Добрый вечер! Прошу помочь с ошибками. Пишу простой пример создания класса, который хочу записывать в файл и считывать с файла. Для записи и считывания создаю функции, и при этом хочу осуществлять ввод вывод через перегрузку операторов >>, <<. Ошибки при записи в файл в файл попадает вот такая запись:
Name:
Age: 0
GPA: 0
Name:
Age: 0
GPA: 0
Name:
Age: 0
GPA: 0
значений массива нет.
Вторая ошибка: не возможно считать с файла. Вот код:
#include <iostream>
#include <fstream>
using namespace std;

class Student
{
private:
string name;
int age;
double GPA;
public:
Student();
Student(string name, int age, double GPA);
string getName()
{
return name;
}
int getAge()
{
return age;
}
double getGPA()
{
return GPA;
}
void print();
friend ostream& operator<<(ostream& out, const Student& s);
friend istream& operator>>(istream& in, Student& s);
void SaveToFile();
void ShowFromFile();
};
ostream& operator<<(ostream& out, const Student& s)
{
out << "Name: " << s.name << endl;
out << "Age: " << s.age << endl;
out << "GPA: " << s.GPA << endl;
return out;
}
istream& operator>>(istream& in, Student& s)
{
in >> s.name >> s.age >> s.GPA;
return in;
}
Student::Student()
{
name = "";
age = 0;
GPA = 0;
}
Student::Student(string name, int age, double GPA)
{
this->name = name;
this->age = age;
this->GPA = GPA;
}
void Student::print()
{
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "GPA: " << GPA << endl;
}
void Student::SaveToFile()
{
fstream f("students.txt", fstream::out | fstream::app);
if (!f)
{
cout << "File error open!" << endl;
exit(1);
}
Student s;
f << s;
f.close();
}
void Student::ShowFromFile()
{
fstream in("students.txt", fstream::in);
if (!in)
{
cout << "File error open!" << endl;
exit(1);
}
cout << "File is open" << endl;
while (!in.eof())
{
Student s;
in >> s;
}
in.close();
}
int main()
{
const int size = 3;
Student s[size] = { {"Alan", 17, 1.23}, {"Peter", 18, 1.89}, {"Mary", 20, 2.04} };
for (int i = 0; i < size; i++)
{
s[i].SaveToFile();
}
//s->ShowFromFile();
В ф-ции SaveToFIle
 //Student s; // Это еще шо такое ? 
f
Александр Щучкин
Александр Щучкин
30 155
Лучший ответ
Алексей Хмельницкий да вы правы, я забыла про указатель на текущий объект))) Спасибо большое! А можете еще посмотреть функцию вывода на экран?
Александр Щучкин А что с ней? У меня она как-то работает:
//s[i].SaveToFile();
s[i].print();

 Name: Alan 
Age: 17
GPA: 1.23
Name: Peter
Age: 18
GPA: 1.89
Name: Mary
Age: 20
GPA: 2.04
Press to close this window...
Как-то так...
TJ
Talgat Junussov
53 963
save to file (){
Student s; //создается новый, пустой экземпляр s
f << s; //его вы и записываете в файл поэтому там нули
f.close();
}
для чтения из файла ваша конструкция не подходит - она так же само создает новый экземпляр s записывает в него данные и сразу же удаляет, выходя из метода.
Вы можете использовать f >> *this, но без цикла while (!=eof), вы же не собираетесь в один экземпляр засунуть весь файл.
К тому же придется узнавать с какого места в файле читать именно свою запись. Чтобы этого избежать - функция чтения из файла должна быть вне класса.
void show_from_file ()
{
fstream in("students.txt", fstream::in);
if (!in)
{
cout << "File error open!" << endl;
exit(1);
}
cout << "File is open" << endl;
Student s;
while (in >> s) // пока происходит успешное чтение
{
s.print(); //печатаем результат
}
in.close();
}
Для заполнения массива используется такая же конструкция, только в функцию передается массив.
void fill_array (Students* arr, int size)
{
fstream in("students.txt", fstream::in);
if (!in)
{
cout << "File error open!" << endl;
exit(1);
}
cout << "File is open" << endl;
for (int i = 0;i<size&&in>>arr[i];i++);
}
ПИ
Петр Ивин
51 416