Как правильно записывать в бинарный файл. У меня появляются ННННННННН... и вместо чисел прямоугольники. С бинарными файлами никогда не работал, а дали лабораторную по ним.
Файл для ввода прикреплен. Что у меня получается в бинарном файле тоже прикреплено
Код:
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct name
{
char fam[20],
im[20],
ot[20];
};
struct exams
{
string item;
int ocenka;
};
struct student
{
name men;
int kurs;
int group;
int usp[10][5];
exams exam[5];
int form;
int bal = 0;
};
//Ввод кол-во студентов с проверкой
int getCountStudent()
{
int N;
cout << "Введите количество студентов: " << endl;
cout << "N = ";
cin >> N;
cout << endl;
while (N < 0)
{
cout << "Ошибка ввода -> getCountStudent()" << endl;
cout << "N = ";
cin >> N;
cout << endl;
}
return N;
}
//Записываем информацию из файла в структуру
void fill_struct(student* a, int N, ifstream &fin)
{
for (int i = 0; i < N; i++)
{
fin >> a[i].men.fam >> a[i].men.im >> a[i].men.ot >> a[i].kurs >> a[i].group;
int count_sessia = a[i].kurs * 2;
for (int j = 0; j < count_sessia; j++)
for (int h = 0; h < 5; h++)
fin >> a[i].usp[j][h];
for (int j = 0; j < 5; j++)
fin >> a[i].exam[j].item >> a[i].exam[j].ocenka;
fin >> a[i].form;
}
}
//Вывод информацию о студентах 4 курса
void show_stud(student* a, int N)
{
for (int i = 0; i < N; i++)
{
if (a[i].kurs == 4)
{
cout << "\n=======================================================================\n" << endl;
cout << "ФИО: " << a[i].men.fam << " " << a[i].men.im << " " << a[i].men.ot << endl;
cout << "Курс: " << a[i].kurs << endl;
cout << "Группа: " << a[i].group << endl;
cout << endl;
for (int j = 0; j < 8; j++)
{
cout << "Оценки за " << j + 1 << " сессию: " << endl;
for (int h = 0; h < 5; h++)
cout << " " << a[i].usp[j][h];
cout << endl;
}
cout << endl;
for (int j = 0; j < 5; j++)
cout << a[i].exam[j].item << " " << a[i].exam[j].ocenka << endl;
cout << "Форма обучения: " << a[i].form << endl;
}
}
cout << "\n=======================================================================\n" << endl;
cout << endl;
}
//Суммируем баллы студентов 4 курса
void sum_bal(student* a, int N)
{
for (int i = 0; i < N; i++)
if (a[i].kurs == 4)
for (int j = 0; j < 8; j++)
for (int h = 0; h < 5; h++)
a[i].bal += a[i].usp[j][h];
}
//Сортируем студентов 4 курса в порядке убывания баллов
void sort_student(student *a, int N)
{
for (int i = 0; i < N; i++)
{
if (a[i].kurs == 4)
{
for (int j = N - 1; j > i; j--)
{
if (a[j].bal > a[j - 1].bal)
{
swap(a[j].men.fam, a[j - 1].men.fam);
swap(a[j].men.im, a[j - 1].men.im);
swap(a[j].men.ot, a[j - 1].men.ot);
swap(a[j].group, a[j - 1].group);
for (int h = 0; h < 8; h++)
for (int g = 0; g < 5; g++)
swap(a[j].usp[h][g], a[j - 1].usp[h][g]);
for (int h = 0; h < 5; h++)
{
swap(a[j].exam[h].item, a[j - 1].exam[h].item);
swap(a[j].exam[h].ocenka, a[j - 1].exam[h].ocenka);
}
swap(a[j].form, a[j - 1].form);
swap(a[j].bal, a[j - 1].bal);
}
}
}
}
}
//Выводим баллы студентов 4 курса
void show_bal(student* a, int N)
{
for (int i = 0; i < N; i++)
if (a[i].kurs == 4)
cout << a[i].men.fam << " - " << a[i].bal << " баллов" << endl;
cout << endl;
}
//Записываем в файл студентов 4 курса по убыванию баллов
void fill_file(student* a, int N, ofstream& fn)
{
for (int i = 0; i < N; i++)
{
if (a[i].kurs == 4)
{
fn << "\n=======================================================================\n";
fn << "ФИО: ";
fn.write((char*)&a[i].men.fam, sizeof(a[i].men.fam));
fn.write((char*)&a[i].men.im, sizeof(a[i].men.im));
fn.write((char*)&a[i].men.ot, sizeof(a[i].men.ot));
fn << "\nКурс: ";
fn.write((char*)&a[i].kurs, sizeof(a[i].kurs));
fn << "\nГруппа: ";
fn.write((char*)&a[i].group, sizeof(a[i].group));
}
}
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream fin("C://Users/Maxim/Desktop/2/student.txt");
ofstream fn("C://Users/Maxim/Desktop/2/student4kurs.bin", ios::binary);
if (!fin.is_open())
cout << "Файл не может быть открыт!\n";
else {
int N = getCountStudent();
student* a = new student[N];
//Записываем информацию из файла в структуру
fill_struct(a, N, fin);
//Вывод студентов
show_stud(a, N);
//Суммируем баллы студентов 4 курса
sum_bal(a, N);
//Выводим баллы студентов 4 курса
show_bal(a, N);
//Сортируем студентов 4 курса в порядке убывания баллов
sort_student(a, N);
//Выводим баллы студентов 4 курса
show_bal(a, N);
//Записываем в файл студентов 4 курса по убыванию баллов
fill_file(a, N, fn);
cout << endl;
fn << endl;
fin.close();
fn.close();
}
return 0;
}