Когда записываю в файл информацию, то она в нем выводится непонятными символами, что сделать с этим?

305
12 августа 2018, 20:50
#include "stdafx.h"[![введите сюда описание изображения][1]][1]
#include <iostream>
#include <locale>
#include <Windows.h>
#include <conio.h>
using namespace std;
struct Subject {
char fam_teatcher[20], name_subj[20];
int mark;
};
struct RecordBook {
char fam_stud[20];
int numbRB, mark;
Subject *subs;
int middleMark;
int kol_subj;
};
int main()
{
setlocale(LC_ALL, "Russian");
int kol_ST = 0, all = 0, Flag = 1, k;
char file[40], choice;
bool fromfile;

cout << " Read the file? Y / N " << endl;
choice = _getch();
FILE *fp;
if (choice == 'Y' || choice == 'y')
{
    fromfile = true;
    cout << "Specify the file storage location: ";
    cin >> file;
    fopen_s(&fp, file, "rb");// fopen_s не позволяет использовать уязвимость переполнения буфера. 
    if (fp == NULL)          //Функция способна проверять и выдавать ошибку буфера.
    {
        cout << " File not found!" << endl;
        system("pause");
        exit(1);
    }
    fread(&kol_ST, sizeof(int), 1, fp);
}
else
{
    fromfile = false;
    cout << " Specify the location of the file creation:";
    cin >> file;
    fopen_s(&fp, file, "wb");
    if (fp == NULL)
    {
        cout << " Error creating file " << endl;
        system("pause");
        exit(1);
    }
    cout << " Enter the number of students: ";
    cin >> kol_ST;
    fwrite(&kol_ST, sizeof(int), 1, fp);
}
RecordBook *kol = new RecordBook[kol_ST];
if (fromfile == true)
{
    for (int i = 0; i < kol_ST; i++)
    {
        fread(&kol[i], sizeof(RecordBook), 1, fp);
        kol[i].subs = new Subject[kol[i].kol_subj];
        for (int j = 0; j < kol[i].kol_subj; j++)
        {
            fread(&kol[i].subs[j], sizeof(Subject), 1, fp);
        }
    }
}
else
{
    for (int i = 0; i < kol_ST; i++)
    {
        cout << "_____________________________" << endl;
        cout << " Enter student's last name: ";
        cin >> kol[i].fam_stud;
        cout << "Enter the student's number of RecordBook: ";
        cin >> kol[i].numbRB;
        cout << " Enter the number of subject: ";
        cin >> kol[i].kol_subj;
        fwrite(&kol[i], sizeof(RecordBook), 1, fp);
        kol[i].subs = new Subject[kol[i].kol_subj];
        cout << "_____________________________" << endl;
        for (int j = 0; j < kol[i].kol_subj; j++) {
            cout << "Subgect #" << j + 1 << endl;
            cout << "Teacher: " << endl; cin >> kol[i].subs[j].fam_teatcher;
            cout << "Subject: " << endl; cin >> kol[i].subs[j].name_subj;
            cout << "Marks: " << endl; cin >> kol[i].subs[j].mark;
            cout << endl;
            fwrite(&kol[i].subs[j], sizeof(Subject), 1, fp);
        }
    }
}
cout << endl << endl << "Students: " << endl;
for (int i = 0; i < kol_ST; i++)
{
    cout << i + 1 << ") " << kol[i].fam_stud << "    " << kol[i].numbRB << endl;
    for (int j = 0; j < kol[i].kol_subj; j++) {
        all += kol[i].subs[j].mark;
        cout << "Subject: " << kol[i].subs[j].name_subj << "  ||  ";
        cout << "Marks: " << kol[i].subs[j].mark << "  ||  ";
        cout << "Teacher: " << kol[i].subs[j].fam_teatcher << endl;
    }
    cout << "========================================================================" << endl;
    k = all / kol[i].kol_subj;
    kol[i].middleMark = k;
    cout << " Average: " << kol[i].middleMark << endl << endl;
    all = 0;
}
cout << "________________________________________________________________________" << endl;
cout << " Subject for which no one received less than 61 points: ";
for (int k = 0; k < kol_ST; k++)
    for (int j = 0; j < kol[k].kol_subj; j++) {
        for (int i = 0; i < kol_ST; i++) {
            if (kol[i].subs[j].mark < 61)
                Flag = 0;
        }
        for (int i = 0; i < 1; i++)
            if (Flag == 1)
                cout << kol[i].subs[j].name_subj << " ";
        Flag = 1;
    }
cout << endl << "________________________________________________________________________" << endl;
RecordBook tmp;    // tmp - доп. переменная для сортировки
int sort_view;    // param_sort - переменная для определения вида сортировки; 
cout << " Sort Students by Ascending (0), Descending (1):";
cin >> sort_view;
for (int i = kol_ST - 1; i > 0; i--)
    for (int j = 0; j < i; j++)                                      // сортировка по возрастанию
        if ((sort_view == 0 && kol[j].middleMark > kol[j + 1].middleMark) || (sort_view == 1 && kol[j].middleMark < kol[j + 1].middleMark)) {
            tmp = kol[j + 1];
            kol[j + 1] = kol[j];
            kol[j] = tmp;
        }
cout << endl;
for (int i = 0; i < kol_ST; i++)
    cout << kol[i].numbRB << " " << kol[i].middleMark << " " << kol[i].fam_stud << endl;
cout << "________________________________________________________________________" << endl;
delete[] kol;
system("pause");
return 0;

}

Answer 1

Вы записываете структуру в файл прямо из памяти.

struct RecordBook {
char fam_stud[20];
int numbRB, mark;
Subject *subs;
int middleMark;
int kol_subj;
};

В структуре указатель на физическую память Subject *subs;. При считывании этот указатель по сути мусор. Записывать нужно индивидуально каждое поле, особенно subs. При записывании char fam_teatcher[20], name_subj[20]; обнуляйте вручную буквы до упора 20 символов. Там был мусор.

READ ALSO
Зачем нужен std::invoke?

Зачем нужен std::invoke?

Увидел сейчас, что в 17ом стандарте появилась новая шаблонная функция std::invokeОчень сильно обрадовался, т

183
Как обращаться к QStandardItemModel в потоке (QThread)?

Как обращаться к QStandardItemModel в потоке (QThread)?

Мне надо обрабатывать отображение миниатюр фотографий в отдельном потоке, иначе код очень долго обрабатываетсяУ меня есть в основном классе...

225
Выполнение/завершение по датам

Выполнение/завершение по датам

Использую cron и quartzНужно реализовать следующие: Администратор назначает на конкретную дату некое задание, которое обновляет базу данных

193
Java + Python на сервере

Java + Python на сервере

У меня есть серверное приложение на JavaВозникла необходимость запускать пользовательские скрипты, для этого я решил использовать Python, так...

242