Создать структуру из двух полей: вещественное и целое. Записать в файл n компонент типа этой структуры

Создать структуру из двух полей: вещественное и целое. Записать в файл n компонент типа этой структуры. Переписать в другой файл последние К компонент из записанных в предыдущий файл.

Получилось вот это, нужно реализовать ещё это Переписать в другой файл последние К компонент из записанных в предыдущий файл.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>
#include <Windows.h>


using namespace std;

struct chisla {
    float a;
    int b;
};

void vvod(chisla nList[100], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout<< "Введите вещественное число: ";
        cin>> nList[i].a;
        cout<< "Введите целое число: ";
        cin>> nList[i].b;
    }
}

void vivod(chisla nList[100], int n)
    {
        for (int i=0; i<n; i++)
            {
                cout<< i+1<< ") ";
                cout<< "Вещественное число: "<< nList[i].a<< "\n";
                cout<< "Целое число: "<< nList[i].b<< "\n";
            }
    }

int zapis(char const * filename, chisla *st, int n)
{

    FILE *f;
    char *c;

    // число записываемых байтов
    int size = n * sizeof(struct chisla);

    if ((f = fopen(filename, "wb")) == NULL)
    {
        perror("Ошибка при открытии файла");
        return 1;
    }
    // записываем количество структур
    c = (char *)&n;
    for (int i = 0; i<sizeof(int); i++)
    {
        putc(*c++, f);
    }

    // посимвольно записываем в файл все структуры
    c = (char *)st;
    for (int i = 0; i < size; i++)
    {
        putc(*c, f);
        c++;
    }
    fclose(f);
}

int vigrys(char const * filename, int n)
{
    FILE *f;
    char *c;
    int m = sizeof(int);
    int i;

    // выделяем память для количества данных
    int *pti = new int[m];
    if ((f = fopen(filename, "r")) == NULL)
    {
        perror("Ошибка при открытии файла");
        return 1;
    }
    // считываем количество структур
    c = (char *)pti;
    while (m>0)
    {
        i = getc(f);
        if (i == EOF) break;
        *c = i;
        c++;
        m--;
    }
    // выделяем память для считанного массива структур
    struct chisla *ptr = new chisla[n];
    c = (char *)ptr;
    // после записи считываем посимвольно из файла
    while ((i= getc(f))!=EOF)
    {
        *c = i;
        c++;
    }
    // перебор загруженных элементов и вывод на консоль

    for (int k = 0; k<n; k++)
    {
        cout<< k+1<< ") ";
        cout<< "Вещественное число: "<< (ptr+k)->a<< "\n";
        cout<< "Целое число: "<< (ptr+k)->b<< "\n";
    }
    fclose(f);
    delete[] pti;
    delete[] ptr;
}

void struc(void) {
    int n;
    cout << "Введите сколько будет списков: ";
    while (!(cin >> n)){
        cout << "error\n";
        cin.clear();
        fflush(stdin);
    }
    char const *filename = "f";
    char *c;
    chisla *nList = new chisla[n];
    vvod(nList, n);
    system("cls");
    chisla *qList = new chisla[n];
    std::copy(nList, nList  + n, qList);
    cout<< "Наша таблица: \n";
    vivod(nList, n);
    cout<< "Вывод из файла: \n";
    zapis(filename, qList, n);
    vigrys(filename, n);
    delete[] qList;
    delete[] nList;
    system("pause");
}

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL,"Rus");
    struc();
    return 0;
}

Ответы (0 шт):