Файловый ввод-вывод объектов класса

196
05 апреля 2017, 16:35

Доброго времени суток. Есть класс, есть менюшка для работы с классом (добавление, вывод объектов класса, удаление) Каким образом организовать запись и чтение полей класса?? (Можно и бинарный файл)

Т.е. мне идейно не понятно как это будет работать :(

Думаю что взять блоковую запись-вывод. (Один объект - одна строка) Но не понятно, как связать всё это с тем что я уже имею.

Буду благодарен если кто-то прояснит.

Ну, тут кода многовато.

Если очень кратко, то как-то так:

while ( x != EXIT)
{
    cin.clear();
    menu();
    cin >> x;
    switch (x)
    {
        case ADD: 
        {
            MemPtr=AddMemory(MemPtr); // выделение памяти под объект, если объектов 0, выделяется 1 ячейка, если уже существуют объекты - то выделяется на 1 больше, а старый массив перезаписывается. Там же вызывается функция для заполнения полей объекта.
            system("cls");
            break;
        }
        case SHOW:
        {
            MemPtr->ShowM(MemPtr); 
            break;
        }
        case DELETE:
        {
            MemPtr=Delete(MemPtr);
            break;
        }
        case EXIT:
        {
            break;
        }
    }
}
return 0;
Members * AddMemory(Members * ptr)
{
    //FILE *in;
    //if (!(in = fopen("xx.txt", "wb")))
    {
        printf("Open file failed.\n");
    }
    if (Members::exist == 0)
    {
        ptr = new Members[Members::exist + 1]; 
        fwrite(ptr, sizeof(Members), 1, in);
        fclose(in);
    }
    else
    {
        Members *tmp = new Members[Members::exist+1];
        for (int i = 0; i < Members::exist; ++i)
        {
            tmp[i] = ptr[i];
        }
        delete[] ptr;
        ptr = tmp;
    }
    ptr[Members::exist].AddMember();
    Members::exist++;
    return ptr;
}
Answer 1

Пусть у нас есть класс A. Тогда, записывать будем каждое поле класса отдельно. В силу того, что есть строгая последовательность, то при считывании мы однозначно восстановим наши данные. Это легко сделать:

class A {
    p1 int;
    p2 int;
    p3 int;
}
void WriteToFile(vector <A> vec, string pathToFile) {
    ofstream fout;
    fout.open(pathToFile);
    fout << vec.size();
    for (int i = 0; i < vec.size(); ++i) {
        fout << vec[i].p1 << vec[i].p2 << vec[i].p3;
    }
    fout.close();
}
vector <A> vec ReadFromFile(string pathToFile) {
    ifstream fin;
    fin.open(pathToFile);
    int n;
    fin >> n;
    for (int i = 0; i < vec.size(); ++i) {
        fin >> vec[i].p1 >> vec[i].p2 >> vec[i].p3;
    }
    fin.close();
}


void WriteToFile(A *vec, int n, string pathToFile) {
    ofstream fout;
    fout.open(pathToFile);
    fout << n;
    for (int i = 0; i < vec.size(); ++i) {
        fout << vec[i].p1 << vec[i].p2 << vec[i].p3;
    }
    fout.close();
}
int *A ReadFromFile(int &n, string pathToFile) {
    ifstream fin;
    fin.open(pathToFile);
    int n;
    A *vec = new A[n];
    fin >> n;        
    for (int i = 0; i < vec.size(); ++i) {
        fin >> vec[i].p1 >> vec[i].p2 >> vec[i].p3;
    }
    fin.close();
}

Небольшое пояснение к коду. Будем поочерёдно перебирать элементы нашего массива и записывать их в файл. На каждой итерации будем поэлементно писать поля класса A.

Замечу, что коль скоро Вы поэлементно считываете и обрабатываете элементы массива, имеет смысл каждый обработанный элемент сразу записывать в файл, если число элементов достаточно большое. Это следует предпринимать, если все считываемые элементы в память не помещаются.

READ ALSO
Поочерёдное открытие окон в Qt

Поочерёдное открытие окон в Qt

Например, есть QMainWindow, где находится форма входа (логин, пароль)При нажатии открывается еще один QMainWindow, уже сама программа, а старое окно закрывается...

285
Как передать в функцию массив, который хранится в обьекте

Как передать в функцию массив, который хранится в обьекте

У меня в объекте класса хранится инициализированный массивТеперь нужно в отдельной функции сделать манипуляции с этим массивом, но мне его...

169
проблемы stm32 uart

проблемы stm32 uart

Всем приветВозникла небольшая проблема

335
Натуральные числа, не делящиеся ни на один из квадратов простых чисел [требует правки]

Натуральные числа, не делящиеся ни на один из квадратов простых чисел [требует правки]

Нужно найти все натуральные числа, не делящиеся ни на один из квадратов простых чисел и не превышающие число N (1 <= N <= 10^9)

205