Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2022, 21:23   #1
Moctavius
 
Регистрация: 09.04.2022
Сообщений: 5
По умолчанию Как правильно записывать в бинарный файл

Как правильно записывать в бинарный файл. У меня появляются ННННННННН... и вместо чисел прямоугольники. С бинарными файлами никогда не работал, а дали лабораторную по ним.
Файл для ввода прикреплен. Что у меня получается в бинарном файле тоже прикреплено
Код:
#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;
}
Изображения
Тип файла: jpg 1.jpg (97.9 Кб, 11 просмотров)
Вложения
Тип файла: txt student.txt (2.3 Кб, 0 просмотров)
Moctavius вне форума Ответить с цитированием
Старый 20.04.2022, 21:42   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
            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));
Попробуйте strlen вместо sizeof. sizeof возвращает длину массива, а не строки записанной в нем.

Код:
            fn << "\nКурс: ";
            fn.write((char*)&a[i].kurs, sizeof(a[i].kurs));
            fn << "\nГруппа: ";
            fn.write((char*)&a[i].group, sizeof(a[i].group));
Перед выводом чисел нужно преобразовать их в символьный вид itoa. И так же использовать strlen для определения длины строки вместо sizeof.

Последний раз редактировалось macomics; 20.04.2022 в 21:45.
macomics вне форума Ответить с цитированием
Старый 20.04.2022, 22:29   #3
Moctavius
 
Регистрация: 09.04.2022
Сообщений: 5
По умолчанию

macomics, Спасибо Вам большое, очень помогли!
Moctavius вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записывать и считывать данные в файл? Roman_Jarckov23 Паскаль, Turbo Pascal, PascalABC.NET 1 14.09.2018 09:26
правильно ли так записывать? wolf777 Общие вопросы Delphi 9 09.04.2017 17:52
Изменить mysql на файл (вместо записи в БД записывать в текстовый файл) прак PHP 2 16.12.2015 23:21
C++, задача на бинарный файл (Бинарный файл состоит из записей по 5 бит) zaitsevmishka Помощь студентам 3 16.05.2014 21:39
Как записывать в файл Rain Общие вопросы Delphi 5 15.09.2007 18:56