Nie wyświetla mi danych uczniów poprawnie

0

Jak w temacie.Zamiast imienia,nazwiska,plci i PESELu wyrzuca mi głupoty na ekran

#include "database.h"

int main()
{
    data::Statistics statistics;
    std::vector<data::Student>students;

    for(;;)
    {
        system("cls");
        data::loadDatabase(statistics,students);
        console::selectOption(students,statistics);
    }
    return 0;
}
#ifndef DATABASE_H
#define DATABASE_H
#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <vector>
#include <ctime>

namespace data
{
    enum SEX{MALE=1,FEMALE=2};
    const size_t sizePESEL = 11;

    struct Statistics{
       int numberStudents=0;
       int numberMens=0;
       int numberWomans=0;
       float averageClass=0.0;
       void loadStatistics();
       void saveStatisticsToFile();
    };

    struct Student{
       std::string name;
       std::string surname;
       char PESEL[11];
       int age;
       SEX sex;
       std::vector<float>ratings;
       void addStudent(Statistics &statistic);
       void saveStudentToFile();
    };

    void loadDatabase(data::Statistics &statistics,std::vector<data::Student> &_student);
    void viewStudents(std::vector<data::Student>&student);
}

namespace console
{
    void selectOption(std::vector<data::Student>&students,data::Statistics &statistic);
    void mainMenu(data::Statistics &stat);
}

namespace calculations
{
    int calculateAge(data::Student student);
    void checkSex(data::Student &student,data::Statistics &statistics);
}

#endif // DATABASE_H
#include "database.h"

void console::mainMenu(data::Statistics &statistics)
{
    system("cls");
    std::cout<<"DZIENNIK KLASY"<<std::endl;
    std::cout<<"====================="<<std::endl;
    std::cout<<"Liczba uczniow: "<<statistics.numberStudents<<std::endl;
    std::cout<<"Liczba mezczyzn: "<<statistics.numberMens<<std::endl;
    std::cout<<"Liczba kobiet: "<<statistics.numberWomans<<std::endl;
    std::cout<<"Srednia klasy: "<<statistics.averageClass<<std::endl;
    std::cout<<"====================="<<std::endl;
    std::cout<<"Dostepne operacje:"<<std::endl;
    std::cout<<"1.Dodaj ucznia"<<std::endl;
    std::cout<<"2.Dodaj ocene"<<std::endl;
    std::cout<<"3.Wyswietl dane uczniow"<<std::endl;
    std::cout<<"4.Usun ucznia"<<std::endl;
    std::cout<<"5.Czyszczenie ocen"<<std::endl;
    std::cout<<"6.WYJSCIE"<<std::endl;
    std::cout<<"=====================";
}

void data::loadDatabase(data::Statistics &statistics,std::vector<data::Student> &_student)
{
    _student.clear();

    std::ifstream loadSatisticFile("stat.bin",std::ios::binary);
    if(!loadSatisticFile.is_open())
    {
        std::cout<<"Brak bazy danych! Ladowanie programu..."<<std::endl;
        Sleep(1000);
        system("cls");
        console::mainMenu(statistics);
    } else {

        loadSatisticFile.read((char*)&statistics.numberStudents,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberMens,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberWomans,sizeof(int));
        loadSatisticFile.read((char*)&statistics.averageClass,sizeof(float));
        loadSatisticFile.close();
        data::Student student;

        for(int i=0; i<statistics.numberStudents;i++)
        {
            std::ifstream loadStudentListFile("listStudent.bin",std::ios::binary);
            std::string nameStudent,surnameStudent;
            getline(loadSatisticFile,nameStudent,'\0');
            getline(loadSatisticFile,surnameStudent,'\0');
            loadSatisticFile.close();

            std::string nameFileStudent = nameStudent+surnameStudent+".bin";
            std::ifstream loadStudentFile(nameFileStudent.c_str(),std::ios::binary);
            getline(loadSatisticFile,student.name,'\0');
            getline(loadSatisticFile,student.surname,'\0');
            for(size_t i=0;i<data::sizePESEL;i++) {loadSatisticFile.read((char*)&student.PESEL[i],sizeof(char));}
            loadSatisticFile.read((char*)&student.age,sizeof(int));
            loadSatisticFile.read((char*)&student.sex,sizeof(int));
            loadSatisticFile.close();

            _student.push_back(student);

            console::mainMenu(statistics);
        }

    }
}

void console::selectOption(std::vector<data::Student>&students,data::Statistics &statistic)
{
    char choice = getch();
    data::Student student;

    switch(choice){
      case '1':
          student.addStudent(statistic);
          break;
      case '2':
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
      case '3':
          data::viewStudents(students);
          break;
      case '4':
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
      case '5':
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
      case '6':
          exit(0);
          break;
      default:
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
    }
}

void calculations::checkSex(data::Student &student,data::Statistics &statistics)
{
    int numberSex = student.PESEL[data::sizePESEL-1]-'0';
    if(numberSex%2==0)
    {
        student.sex = data::FEMALE;
        statistics.numberWomans++;
    }else{
        student.sex = data::MALE;
        statistics.numberMens++;
    }
}

int calculations::calculateAge(data::Student student)
{
     //POBRANIE DATY URODZENIA Z NUMERU PESEL
    int *birthDate = new int[6];

    for(int i=0;i<2;i++)birthDate[i] = student.PESEL[i]-'0'; //rok
    for(int i=2;i<4;i++)birthDate[i] = student.PESEL[i]-'0'; //miesiac
    for(int i=4;i<6;i++)birthDate[i] = student.PESEL[i]-'0'; //dzien

    int birthYear;

    if(birthDate[0]==9)
    {
        birthYear = 1900+(birthDate[0]*10)+birthDate[1];

    }else if(birthDate[0]==0){

        birthYear = 2000+(birthDate[0]*10)+birthDate[1];
    }

    int birthMonth = birthDate[2]*10+birthDate[3];
    int birthDay = birthDate[4]*10+birthDate[5];

    delete[]birthDate;

    //POBRANIE AKTUALNEJ DATY
    time_t _time;
    struct tm * ptr;
    time( & _time );
    ptr = localtime( & _time );
    int currentDay = ptr->tm_mday;
    int currentMonth = 1+(ptr->tm_mon);
    int currentYear = (ptr->tm_year)+1900;

    //OBLICZENIE WIEKU
    if(currentMonth<birthMonth || (currentMonth==birthMonth && currentDay<birthDay))
    {
        return currentYear-birthYear-1;
    } else return currentYear-birthYear;
}


 void data::Student::addStudent(Statistics &statistic)
 {
    Student student;

    system("cls");
    std::cout<<"DODAWANIE UCZNIA"<<std::endl;
    std::cout<<"================"<<std::endl;
    std::cout<<"Imie: ";
    std::cin >> student.name;
    std::cout<<"Nazwisko: ";
    std::cin >> student.surname;
    std::cout<<"PESEL: ";
    for(size_t i=0; i<sizePESEL; i++)
    {
        student.PESEL[i] = getch();
        std::cout<<student.PESEL[i];
    }
    calculations::checkSex(student,statistic);
    student.age=calculations::calculateAge(student);
    statistic.numberStudents++;

    std::string nameAndSurname = student.name+student.surname+".bin";
    std::ofstream studentFileSave(nameAndSurname.c_str(),std::ios::binary);
    studentFileSave.write(student.name.c_str(),name.size()+1);
    studentFileSave.write(student.surname.c_str(),surname.size()+1);
    studentFileSave.write((const char*)&student.age,sizeof(int));
    for(size_t i=0; i<data::sizePESEL;i++)studentFileSave.write((const char*)&student.PESEL[i],sizeof(char));
    studentFileSave.write((const char*)&student.sex,sizeof(int));
    for(size_t i=0;i<ratings.size();i++)studentFileSave.write((const char*)&student.ratings[i],sizeof(float));
    studentFileSave.close();

    std::ofstream studentListFile("listStudent.bin",std::ios::binary | std::ios::app);
    studentListFile.write(student.name.c_str(),student.name.size()+1);
    studentListFile.write(student.surname.c_str(),student.surname.size()+1);
    studentListFile.close();

    std::ofstream statFileSave("stat.bin",std::ios::binary);
    statFileSave.write((const char*)&statistic.numberStudents,sizeof(int));
    statFileSave.write((const char*)&statistic.numberMens,sizeof(int));
    statFileSave.write((const char*)&statistic.numberWomans,sizeof(int));
    statFileSave.write((const char*)&statistic.averageClass,sizeof(float));
    statFileSave.close();
 }

 void data::viewStudents(std::vector<data::Student>&student)
 {
    system("cls");
    for(size_t i=0; i<student.size();i++)
    {
        std::cout<<i+1<<". "<<student[i].name<<" "<<student[i].surname<<" | Plec: ";
        if(student[i].sex==1) std::cout<<"Mezczyzna | PESEL: "; else std::cout<<"Kobieta | PESEL: ";
        std::cout<<student[i].PESEL;
        std::cout<<" | Wiek: "<<student[i].age<<std::endl;
    }
    std::cout<<std::endl;
    std::cout<<"Aby wrocic nacisnij dowolny klawisz..."<<std::endl;
    getch();
 }
0

Przygotuj MCVE, tego kodu jest za dużo żeby to ogarnąć bez możliwości odtworzenia.

Patrząc po tym i poprzednich kodach, pewnie masz gdzieś UB związane z niezbyt fajną serializacją.

Btw, polecam lekturę: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0

Problem dotyczy poprawnego wyświetlenia danych uczniów z kontenera zawierajacego struktury.Sęk w tym,że nie wiem czy winny jest zapis plików czy ich odczyt.

Funkcja tworząca nowego ucznia:

void data::Student::addStudent(Statistics &statistic)
 {
    Student student;

    system("cls");
    std::cout<<"DODAWANIE UCZNIA"<<std::endl;
    std::cout<<"================"<<std::endl;
    std::cout<<"Imie: ";
    std::cin >> student.name;
    std::cout<<"Nazwisko: ";
    std::cin >> student.surname;
    std::cout<<"PESEL: ";
    for(size_t i=0; i<sizePESEL; i++)
    {
        student.PESEL[i] = getch();
        std::cout<<student.PESEL[i];
    }
    calculations::checkSex(student,statistic);
    student.age=calculations::calculateAge(student);
    statistic.numberStudents++;

    std::string nameAndSurname = student.name+student.surname+".bin";
    std::ofstream studentFileSave(nameAndSurname.c_str(),std::ios::binary);
    studentFileSave.write(student.name.c_str(),name.size()+1);
    studentFileSave.write(student.surname.c_str(),surname.size()+1);
    studentFileSave.write((const char*)&student.age,sizeof(int));
    for(size_t i=0; i<data::sizePESEL;i++)studentFileSave.write((const char*)&student.PESEL[i],sizeof(char));
    studentFileSave.write((const char*)&student.sex,sizeof(int));
    for(size_t i=0;i<ratings.size();i++)studentFileSave.write((const char*)&student.ratings[i],sizeof(float));
    studentFileSave.close();

    std::ofstream studentListFile("listStudent.bin",std::ios::binary | std::ios::app);
    studentListFile.write(student.name.c_str(),student.name.size()+1);
    studentListFile.write(student.surname.c_str(),student.surname.size()+1);
    studentListFile.close();

    std::ofstream statFileSave("stat.bin",std::ios::binary);
    statFileSave.write((const char*)&statistic.numberStudents,sizeof(int));
    statFileSave.write((const char*)&statistic.numberMens,sizeof(int));
    statFileSave.write((const char*)&statistic.numberWomans,sizeof(int));
    statFileSave.write((const char*)&statistic.averageClass,sizeof(float));
    statFileSave.close();
 }

Odczyt danych dot. uczniów przez wektor:

void data::viewStudents(std::vector<data::Student>&student)
 {
    system("cls");
    for(size_t i=0; i<student.size();i++)
    {
        std::cout<<i+1<<". "<<student[i].name<<" "<<student[i].surname<<" | Plec: ";
        if(student[i].sex==1) std::cout<<"Mezczyzna | PESEL: "; else std::cout<<"Kobieta | PESEL: ";
        std::cout<<student[i].PESEL;
        std::cout<<" | Wiek: "<<student[i].age<<std::endl;
    }
    std::cout<<std::endl;
    std::cout<<"Aby wrocic nacisnij dowolny klawisz..."<<std::endl;
    getch();
 }

Ładowanie bazy danych

void data::loadDatabase(data::Statistics &statistics,std::vector<data::Student> &_student)
{
    _student.clear();

    std::ifstream loadSatisticFile("stat.bin",std::ios::binary);
    if(!loadSatisticFile.is_open())
    {
        std::cout<<"Brak bazy danych! Ladowanie programu..."<<std::endl;
        Sleep(1000);
        system("cls");
        console::mainMenu(statistics);
    } else {

        loadSatisticFile.read((char*)&statistics.numberStudents,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberMens,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberWomans,sizeof(int));
        loadSatisticFile.read((char*)&statistics.averageClass,sizeof(float));
        loadSatisticFile.close();
        data::Student student;

        for(int i=0; i<statistics.numberStudents;i++)
        {
            std::ifstream loadStudentListFile("listStudent.bin",std::ios::binary);
            std::string nameStudent,surnameStudent;
            getline(loadSatisticFile,nameStudent,'\0');
            getline(loadSatisticFile,surnameStudent,'\0');
            loadSatisticFile.close();

            std::string nameFileStudent = nameStudent+surnameStudent+".bin";
            std::ifstream loadStudentFile(nameFileStudent.c_str(),std::ios::binary);
            getline(loadSatisticFile,student.name,'\0');
            getline(loadSatisticFile,student.surname,'\0');
            for(size_t i=0;i<data::sizePESEL;i++) {loadSatisticFile.read((char*)&student.PESEL[i],sizeof(char));}
            loadSatisticFile.read((char*)&student.age,sizeof(int));
            loadSatisticFile.read((char*)&student.sex,sizeof(int));
            loadSatisticFile.close();

            _student.push_back(student);

            console::mainMenu(statistics);
        }

    }
}
0

OK - modyfikując kod,aby zgłaszał błędy odczytu znalazłam fragment kodu,który powoduje taki problem:

 std::ifstream loadStudentListFile("listStudent.bin",std::ios::binary);
 std::string nameStudent,surnameStudent;
 getline(loadSatisticFile,nameStudent,'\0');
 getline(loadSatisticFile,surnameStudent,'\0');
 loadSatisticFile.close();

 std::string nameFileStudent = nameStudent+surnameStudent+".bin";
 std::ifstream loadStudentFile(nameFileStudent.c_str(),std::ios::binary);

Pomimo,że plik o wybranych parametrach fizycznie istnieje na dysku to program nie może go odczytać.....

 std::string nameFileStudent = nameStudent+surnameStudent+".bin";

Imie i nazwisko kazdego ucznia jest zapisywane w pliku binarnym aby potem program pobierajac te dane mogl odczytac pliki uczniow zatytuowane zlepkiem imienia i nazwiska.

0

Sprawdź hex edytorem czy dane się zgadzają. Jak jesteś na linuksie to wystarczy hexdump -C plik.bin

0
Quanti994 napisał(a):

Ładowanie bazy danych

void data::loadDatabase(data::Statistics &statistics,std::vector<data::Student> &_student)
{
   ...
    std::ifstream loadSatisticFile("stat.bin",std::ios::binary); //otwierasz plik loadSatisticFile
    if(!loadSatisticFile.is_open())
    {
        ...
    } else {

        loadSatisticFile.read((char*)&statistics.numberStudents,sizeof(int)); //czytasz z loadSatisticFile
        loadSatisticFile.read((char*)&statistics.numberMens,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberWomans,sizeof(int));
        loadSatisticFile.read((char*)&statistics.averageClass,sizeof(float));
        loadSatisticFile.close(); //zamykasz plik loadSatisticFile
        data::Student student;

        for(int i=0; i<statistics.numberStudents;i++)
        {
            std::ifstream loadStudentListFile("listStudent.bin",std::ios::binary);
            std::string nameStudent,surnameStudent;
            getline(loadSatisticFile,nameStudent,'\0'); //czytasz z loadSatisticFile
            getline(loadSatisticFile,surnameStudent,'\0');
            loadSatisticFile.close(); //zamykasz loadSatisticFile

            std::string nameFileStudent = nameStudent+surnameStudent+".bin";
            std::ifstream loadStudentFile(nameFileStudent.c_str(),std::ios::binary);
            getline(loadSatisticFile,student.name,'\0'); //czytasz z loadSatisticFile
            getline(loadSatisticFile,student.surname,'\0');
            for(size_t i=0;i<data::sizePESEL;i++) {loadSatisticFile.read((char*)&student.PESEL[i],sizeof(char));}
            loadSatisticFile.read((char*)&student.age,sizeof(int));
            loadSatisticFile.read((char*)&student.sex,sizeof(int));
            loadSatisticFile.close(); //zamykasz loadSatisticFile

            _student.push_back(student);

            console::mainMenu(statistics);
        }

    }
}
0

Niestety problemów ciąg dalszy...
Prawie wszystko działa,ale program wyświetla niepoprawnie PESEL oraz nie liczy wieku

Wprowadzanie PESEL

std::cout<<"PESEL: ";
    for(int i=0; i<sizePESEL; i++)
    {
        s->PESEL[i] = getch();
        std::cout<<s->PESEL[i];
    }

Zapisywanie PESEL do pliku

for(int i=0; i<data::sizePESEL;i++){studentFileSave.write(&s->PESEL[i],sizeof(char));}

Ładowanie PESEL z pliku

 for(int j=0;j<data::sizePESEL;j++) {loadStudentFile.read(&student.PESEL[j],sizeof(char));}

Wyswietlanie PESEL:

if(student[i].sex==MALE) std::cout<<"Mezczyzna | PESEL: "; else std::cout<<"Kobieta | PESEL: ";
        for(int j=0;j<data::sizePESEL;j++){std::cout<<student[i].PESEL[j];}
        std::cout<<" | Wiek: "<<student[i].age<<std::endl;
0

Działa
Poprawiony kod:

#include "database.h"

void console::mainMenu(data::Statistics &statistics)
{
    system("cls");
    std::cout<<"DZIENNIK KLASY"<<std::endl;
    std::cout<<"====================="<<std::endl;
    std::cout<<"Liczba uczniow: "<<statistics.numberStudents<<std::endl;
    std::cout<<"Liczba mezczyzn: "<<statistics.numberMens<<std::endl;
    std::cout<<"Liczba kobiet: "<<statistics.numberWomans<<std::endl;
    std::cout<<"Srednia klasy: "<<statistics.averageClass<<std::endl;
    std::cout<<"====================="<<std::endl;
    std::cout<<"Dostepne operacje:"<<std::endl;
    std::cout<<"1.Dodaj ucznia"<<std::endl;
    std::cout<<"2.Dodaj ocene"<<std::endl;
    std::cout<<"3.Wyswietl dane uczniow"<<std::endl;
    std::cout<<"4.Usun ucznia"<<std::endl;
    std::cout<<"5.Czyszczenie ocen"<<std::endl;
    std::cout<<"6.WYJSCIE"<<std::endl;
    std::cout<<"=====================";
}

void data::loadDatabase(data::Statistics &statistics,std::vector<data::Student> &_student)
{
    _student.clear();

    std::ifstream loadSatisticFile("stat.bin",std::ios::binary);
    if(!loadSatisticFile.is_open())
    {
        std::cout<<"Brak bazy danych! Ladowanie programu..."<<std::endl;
        Sleep(1000);
        system("cls");
        console::mainMenu(statistics);
    } else {

        loadSatisticFile.read((char*)&statistics.numberStudents,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberMens,sizeof(int));
        loadSatisticFile.read((char*)&statistics.numberWomans,sizeof(int));
        loadSatisticFile.read((char*)&statistics.averageClass,sizeof(float));
        loadSatisticFile.close();
        data::Student student;

        std::ifstream loadStudentListFile("listStudent.bin",std::ios::binary);
        for(int i=0; i<statistics.numberStudents;i++)
        {
            std::string nameStudent,surnameStudent;
            getline(loadStudentListFile,nameStudent,'\0');
            getline(loadStudentListFile,surnameStudent,'\0');


            std::string nameFileStudent = nameStudent+surnameStudent+".bin";
            std::ifstream loadStudentFile(nameFileStudent.c_str(),std::ios::binary);
            getline(loadStudentFile,student.name,'\0');
            getline(loadStudentFile,student.surname,'\0');
            loadStudentFile.read((char*)&student.age,sizeof(int));
            for(int j=0;j<data::sizePESEL;j++)
            {
                loadStudentFile.read((char*)&student.PESEL[j],sizeof(int));
            }
            loadStudentFile.read((char*)&student.sex,sizeof(int));
            loadStudentFile.close();

            _student.push_back(student);

        }
        loadStudentListFile.close();
        console::mainMenu(statistics);

    }
}

void console::selectOption(std::vector<data::Student>&students,data::Statistics &statistic)
{
    char choice = getch();
    data::Student student;
    data::Student *st;
    st = &student;

    switch(choice){
      case '1':
          student.addStudent(statistic,st);
          break;
      case '2':
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
      case '3':
          data::viewStudents(students);
          break;
      case '4':
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
      case '5':
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
      case '6':
          exit(0);
          break;
      default:
          std::cout<<"Nieprawidlowy znak!"<<std::endl;
          break;
    }
}

void calculations::checkSex(data::Student *s,data::Statistics &statistics)
{
    int numberSex = s->PESEL[data::sizePESEL-1];
    if(numberSex%2==0)
    {
        s->sex= data::FEMALE;
        statistics.numberWomans++;
    }else{
        s->sex = data::MALE;
        statistics.numberMens++;
    }
}

int calculations::calculateAge(data::Student *s)
{
     //POBRANIE DATY URODZENIA Z NUMERU PESEL
    int *birthDate = new int[6];

    for(int i=0;i<2;i++)birthDate[i] = s->PESEL[i]; //rok
    for(int i=2;i<4;i++)birthDate[i] = s->PESEL[i]; //miesiac
    for(int i=4;i<6;i++)birthDate[i] = s->PESEL[i]; //dzien

    int birthYear;

    if(birthDate[0]==9)
    {
        birthYear = 1900+(birthDate[0]*10)+birthDate[1];

    }else if(birthDate[0]==0){

        birthYear = 2000+(birthDate[0]*10)+birthDate[1];
    }

    int birthMonth = birthDate[2]*10+birthDate[3];
    int birthDay = birthDate[4]*10+birthDate[5];

    delete[]birthDate;

    //POBRANIE AKTUALNEJ DATY
    time_t _time;
    struct tm * ptr;
    time( & _time );
    ptr = localtime( & _time );
    int currentDay = ptr->tm_mday;
    int currentMonth = 1+(ptr->tm_mon);
    int currentYear = (ptr->tm_year)+1900;

    //OBLICZENIE WIEKU
    if(currentMonth<birthMonth || (currentMonth==birthMonth && currentDay<birthDay))
    {
        return currentYear-birthYear-1;
    } else return currentYear-birthYear;
}


 void data::Student::addStudent(Statistics &statistic,data::Student *s)
 {
    system("cls");
    std::cout<<"DODAWANIE UCZNIA"<<std::endl;
    std::cout<<"================"<<std::endl;
    std::cout<<"Imie: ";
    std::cin >> s->name;
    std::cout<<"Nazwisko: ";
    std::cin >> s->surname;
    std::cout<<"PESEL: ";
    for(int i=0; i<sizePESEL; i++)
    {
        char key = getch();
        s->PESEL[i] = key-'0';
        std::cout<<s->PESEL[i];
    }
    calculations::checkSex(s,statistic);
    s->age=calculations::calculateAge(s);
    statistic.numberStudents++;

    std::string nameAndSurname = s->name+s->surname+".bin";
    std::ofstream studentFileSave(nameAndSurname.c_str(),std::ios::binary);
    studentFileSave.write(s->name.c_str(),s->name.size()+1);
    studentFileSave.write(s->surname.c_str(),s->surname.size()+1);
    studentFileSave.write((const char*)&s->age,sizeof(int));
    for(int i=0; i<data::sizePESEL;i++)
    {
        studentFileSave.write((const char*)&s->PESEL[i],sizeof(int));
    }
    studentFileSave.write((const char*)&s->sex,sizeof(int));
    for(size_t i=0;i<ratings.size();i++)studentFileSave.write((const char*)&s->ratings[i],sizeof(float));
    studentFileSave.close();

    std::ofstream studentListFile("listStudent.bin",std::ios::app | std::ios::binary);
    studentListFile.write(s->name.c_str(),s->name.size()+1);
    studentListFile.write(s->surname.c_str(),s->surname.size()+1);
    studentListFile.close();

    std::ofstream statFileSave("stat.bin",std::ios::binary);
    statFileSave.write((const char*)&statistic.numberStudents,sizeof(int));
    statFileSave.write((const char*)&statistic.numberMens,sizeof(int));
    statFileSave.write((const char*)&statistic.numberWomans,sizeof(int));
    statFileSave.write((const char*)&statistic.averageClass,sizeof(float));
    statFileSave.close();
 }

 void data::viewStudents(std::vector<data::Student>&student)
 {
    system("cls");
    for(int i=0; i<student.size();i++)
    {
        std::cout<<i+1<<". "<<student[i].name<<" "<<student[i].surname<<" | Plec: ";
        if(student[i].sex==MALE) std::cout<<"Mezczyzna | PESEL: "; else std::cout<<"Kobieta | PESEL: ";
        for(int j=0;j<data::sizePESEL;j++){std::cout<<student[i].PESEL[j];}
        std::cout<<" | Wiek: "<<student[i].age<<std::endl;
    }
    std::cout<<std::endl;
    std::cout<<"Aby wrocic nacisnij dowolny klawisz..."<<std::endl;
    getch();
 }
0
Quanti994 napisał(a):

... oraz nie liczy wieku

Moim zmęczonym oczom się wydaje, że źle analizujesz wiek w peselu dla >2000

1

Nie używaj niepotrzebnie dynamicznie alokowanych tablic.

int *birthDate = new int[6];

użyj

int birthDate[6];

lub jeszcze lepiej zmień na array

std::array<int, 6> birthDate;
0

Dlaczego niepotrzebnie ? Tablicy potem nie potrzebuje,więc czemu nie zwolnić pamięci z używania jej ?

  1. Alokacja pamięci na stercie jest wolniejsza.
  2. Nie musisz tworzyć dynamicznych tablic, gdyż z góry znasz jej wielkość.
  3. Używanie gołych wskaźników jest dzisiaj "passé". Odchodzi się od tego aby zminimalizować ryzyko popełnienia błędów. Zamiast tego rekomendowane jest użycie inteligentnych wskaźników.
  4. Zaleca się przestrzegania konwencji RAII.
  5. W momencie alokacji pamięci na stercie zawsze musisz pamiętać o jej zwolnieniu. Jeżeli zapomnisz to masz wyciek pamięci,
    jeżeli usuniesz i następnie przez przypadek użyjesz wskaźnika do usuniętego obiektu to masz UB

Czyli lepiej jest użyć zwykłej tablicy lub std::array, która alokuje się na stosie i automatycznie usuwa w momencie wyjścia z funkcji.

2
       int numberMens=0;
       int numberWomans=0;

o_O

man - men
woman - women

1 użytkowników online, w tym zalogowanych: 0, gości: 1