Ошибка чтения при работе с бинарными файлами
Пытаюсь разобраться с бинарными файлами в С++. Мне нужно сделать несколько функций для работы с файлом, например: чтение данных из файла, добавление данных в файл и тд. Но у меня возникла проблема с заменой данных из файла. Но вместо того чтобы копировать все данные в массив и тогда заменять, я решил воспользоваться функцией "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 шт):
Функция read_data(); в ChangeData() открывает файл второй раз и закрывает. А fseek(F, sizeof(connection), SEEK_SET); с закрытым файловым потоком ничего не делает. Вызывайте read_data(); перед открытием в ChangeData().
Всегда проверяйте ошибки при работе с файлами.
if (fseek(..))
fprintf(stderr,"%s\n",strerror(errno()););