Ошибка чтения при работе с бинарными файлами

Пытаюсь разобраться с бинарными файлами в С++. Мне нужно сделать несколько функций для работы с файлом, например: чтение данных из файла, добавление данных в файл и тд. Но у меня возникла проблема с заменой данных из файла. Но вместо того чтобы копировать все данные в массив и тогда заменять, я решил воспользоваться функцией "fseek". Сначала я попробовал считать 1 елемент из файла, но но после нее у меня выводятся на экран разные каракули, но никак не то что мне нужно. Подскажите, где я ошибся?

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <iomanip>
using namespace std;

struct abonent
{
    char Lastname[20];
    char adress[20];
    int debt;
};

struct telephone
{
    int number;
    char Operator[20];
};

struct connection //структуры для хранения данных
{
     abonent abon[10];
     telephone tel[10];
};

FILE* F;

void input() //функция для ввода и записи данных в файл
{
    connection connect[10];
    char answer;
    
    if (F != NULL)
        remove("FILE.dat");
    else
    {
        F = fopen("FILE.dat", "wb");
        int i = 0;
        do
        {
            cout << "Abonents lastname:" << endl;
            cin >> connect[i].abon->Lastname;
            cout << "Abonents adress:" << endl;
            cin >> connect[i].abon->adress;
            cout << "Abonents debt:" << endl;
            cin >> connect[i].abon->debt;
            cout << "telephone number:" << endl;
            cin >> connect[i].tel->number;
            cout << "telephone operator:" << endl;
            cin >> connect[i].tel->Operator;
            cout << "If you don't want to continue press 'n'?" << endl;
            cin >> answer;
            fflush(stdin);
            fwrite(&connect[i], sizeof(connection), 1, F);
            i++;
        } while (answer != 'n' && answer != 'N');
        fclose(F);
    }
}

void read_data() //функция чтения данных из файла
{
    connection connect;
    if (!(F=fopen("FILE.dat", "rb")))
        cerr << "There is no file";
    else
    {
        fread(&connect, sizeof(connection), 1, F);
        while (!feof(F))
        {
            
            cout << "LastName-----adress-----debt-----number-----operator" << endl;
            cout << setw(8)<<connect.abon->Lastname << setw(11) << connect.abon->adress << setw(9) << connect.abon->debt << setw(11)<<
                connect.tel->number << setw(13) << connect.tel->Operator << endl;
            fread(&connect, sizeof(connection), 1, F);
        }
        fclose(F);
    }
}

void addToFile() // функция добавления данных в файл
{
    if (!(F = fopen("FILE.dat", "ab")))
        cerr << "There is no file";
    else
    {
        connection connect[10];
        char answer;
        int i = 0;
        do
        {
            cout << "YOu are adding something to files" << endl;
            cout << "Abonents lastname:" << endl;
            cin >> connect[i].abon->Lastname;
            cout << "Abonents adress:" << endl;
            cin >> connect[i].abon->adress;
            cout << "Abonents debt:" << endl;
            cin >> connect[i].abon->debt;
            cout << "telephone number:" << endl;
            cin >> connect[i].tel->number;
            cout << "telephone operator:" << endl;
            cin >> connect[i].tel->Operator;
            cout << "If you don't want to continue press 'n'" << endl;
            cin >> answer;
            fflush(stdin);
            fwrite(&connect[i], sizeof(connection), 1, F);
            i++;
        } while (answer != 'n' && answer != 'N');
        fclose(F);
    }
}

void ChangeData()// та самая проблемная функция для изменения данных в файле
{
    connection connect;
    if (!(F = fopen("FILE.dat", "rb+")))
        cerr << "There is no file";
    else
    {
        read_data();
        cout << endl << endl;
        fseek(F, sizeof(connection), SEEK_SET);
        fread(&connect, sizeof(connection), 1, F);

        cout << "LastName-----adress-----debt-----number-----operator" << endl;
        cout << setw(8) << connect.abon->Lastname << setw(11) << connect.abon->adress << setw(9) << connect.abon->debt << setw(11) <<
            connect.tel->number << setw(13) << connect.tel->Operator << endl;
        fclose(F);
    }
}

int main()
{
    
    input();
    ChangeData();
    

    return 0;
}

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

Автор решения: AlexGlebe

Функция read_data(); в ChangeData() открывает файл второй раз и закрывает. А fseek(F, sizeof(connection), SEEK_SET); с закрытым файловым потоком ничего не делает. Вызывайте read_data(); перед открытием в ChangeData().

Всегда проверяйте ошибки при работе с файлами.

if (fseek(..))
  fprintf(stderr,"%s\n",strerror(errno()););
→ Ссылка