Запись объекта класса в файл с использованием fstream, а затем его чтение

Я хочу сделать класс студента и взять 3 входных данных и сделать вывод этого файла. Как к этому? Это моя попытка:

#include <iostream>
using namespace std;
class Student{
  private:
    char name[50];
    char id[50];
    int age;
  public:
    void getdata()
    {
        //take name as input
        //take id as input
        //take age as input
    }
    void showdata()
    {
         //display stored file
    }
 }

int main()
{
    Student s1;
    ofstream s1("student.txt");      //i want to store that 's1' object
    //anything else
    return 0;
}

person Jamil    schedule 08.06.2013    source источник
comment
Вы использовали имя S1 для двух разных типов объектов.   -  person Charlie    schedule 08.06.2013
comment
bcz у меня есть логика, из которой я вывожу объект s1. Разве это не так?   -  person Jamil    schedule 08.06.2013
comment
Я не думаю, что вы можете написать объект s1 Student в текстовом файле, используя объект s1 ofstream, только потому, что у вас такое же имя   -  person Charlie    schedule 08.06.2013
comment
Вы должны попытаться немного изучить C++, прежде чем пытаться делать такие вещи. Здесь есть список хороших книг.   -  person juanchopanza    schedule 08.06.2013
comment
тогда как сделать вывод объекта с помощью fstream. Либо в txt файл, либо в какой-то другой!   -  person Jamil    schedule 08.06.2013


Ответы (2)


C++ использует парадигму потока для реализации стандартного ввода/вывода.

Потоковая парадигма означает, что если ваше приложение хочет получить доступ/использовать ресурс (файл, консоль и т. д.), поток действует как посредник между вашим приложением и ресурсом:

                     ofstream       +----+
              +-------------------->|File|
              |                     +----+
              |
       +------+------+
       | Application |
       +------+------+
              |
              |                     +-------+
              +-------------------->|Console|
                        cout        +-------+

Это означает, что все операции записи/чтения, которые вы выполняете, на самом деле являются потоковыми операциями. Дело в том, что потоковые операции в основном одинаковы, независимо от того, какой тип ресурса (и какой тип потока) вы используете.

Это позволяет нам реализовать «общий» (общий смысл, действительный для любого типа потока/ресурса). Как? Перегрузка операторов C++ >> и ‹‹.

Для операций ввода (ввод означает получение данных из потока и помещение их в нашу переменную/объект) нам нужно перегрузить оператор >> следующим образом:

istream& operator>>(istream& is , MyClass& object)
{
    is >> object.myClassAtributte; (1)
    ... //Same for every attribute of your class.

    return is;
}

Во-первых, обратите внимание, что входной поток передается по ссылке. По ссылке, потому что потоки не копируются (Что именно означает копирование потока? Скопируйте ссылку между вашим приложением и ресурсом? Звучит смешно), и неконстантны, потому что вы собираетесь изменить поток (Вы собираетесь написать через это).

Наконец, обратите внимание, что функция не возвращает void, а возвращает ссылку на тот же поток, который был передан в функцию. Это позволяет вам писать конкатенированные предложения записи/чтения, такие как cout << "Hello. " << "Im" << " Manu343726" << endl;

Для операций вывода (Output означает отправку данных в поток) нам нужно перегрузить оператор ‹‹, реализация которого точно такая же:

ostream& operator<<(ostream& os , const MyClass& object)
{
    os << object.myClassAtributte; (1)
    ... //Same for every attribute of your class.

    return os;
}

Обратите внимание, что в этом случае ваш объект передается как константа, потому что мы не будем его изменять (мы будем только читать его атрибуты).

(1) Предпочтительно реализовать эти функции, сделав их друзьями вашего класса, чтобы предоставить нам доступ к закрытым/защищенным членам.

person Manu343726    schedule 08.06.2013

Вы должны перегрузить операторы << и >> для ostream и istream

std::ostream& operator<< (std::ostream& stream, const Student& student)
std::istream& operator<< (std::istream& stream, Student& student)

сделать их друзьями и реализовать

person Neel Basu    schedule 08.06.2013