Ten kod działa - na ekranie pojawiają mi się poprawne wartości w statystykach (zera)
#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
namespace variables
{
char choice;
}
enum SEX{MALE,FEMALE};
struct Statistics{
int numberStudents;
int numberMens;
int numberWomans;
float averageClass;
};
struct Student{
std::string name;
std::string surname;
char PESEL[11];
size_t age;
SEX sex;
//float ratings[] - vector
};
void loadStatistics(Statistics stat)
{
std::ifstream statFileLoad;
statFileLoad.open("data.bin",std::ios::binary);
if(statFileLoad.is_open())
{
statFileLoad.read((char*)&stat,sizeof(stat));
std::cout<<"DZIENNIK KLASY"<<std::endl;
std::cout<<"====================="<<std::endl;
std::cout<<"Liczba uczniow: "<<stat.numberStudents<<std::endl;
std::cout<<"Liczba mezczyzn: "<<stat.numberMens<<std::endl;
std::cout<<"Liczba kobiet: "<<stat.numberWomans<<std::endl;
std::cout<<"Srednia klasy: "<<stat.averageClass<<std::endl;
std::cout<<"====================="<<std::endl;
statFileLoad.close();
} else
{
statFileLoad.close();
stat.numberStudents = 0;
stat.numberMens = 0;
stat.numberWomans = 0;
stat.averageClass = 0.0;
std::ofstream statFileSave("data.bin",std::ios::binary);
statFileSave.write((const char*)&stat,sizeof(stat));
statFileSave.close();
for(int i=0;i<3;i++)
{
std::cout<<"Brak zapisanych uczniow! Start za "<<3-i<<" sekundy..."<<std::endl;
Sleep(1000);
system("cls");
}
}
}
void mainMenu(Statistics stat)
{
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 ucznia"<<std::endl;
std::cout<<"4.Usun ucznia"<<std::endl;
std::cout<<"5.Czyszczenie ocen"<<std::endl;
std::cout<<"6.WYJSCIE"<<std::endl;
std::cout<<"=====================";
variables::choice = getch();
if(variables::choice=='6')
{
exit(0);
} else std::cout<<"Nieprawidlowy znak!"<<std::endl;
}
int main()
{
//£ADOWANIE DANYCH
Statistics statistics;
loadStatistics(statistics);
//Student students[]; - vector
for(;;)
{
//system("cls");
mainMenu(statistics);
}
return 0;
}
Ten już nie - zamiast 0 w statystkach wyświetlają mi się jakieś śmieci.
#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
namespace variables
{
char choice;
}
enum SEX{MALE,FEMALE};
struct Statistics{
int numberStudents;
int numberMens;
int numberWomans;
float averageClass;
};
struct Student{
std::string name;
std::string surname;
char PESEL[11];
size_t age;
SEX sex;
//float ratings[] - vector
};
void loadStatistics(Statistics stat)
{
std::ifstream statFileLoad;
statFileLoad.open("data.bin",std::ios::binary);
if(statFileLoad.is_open())
{
statFileLoad.read((char*)&stat,sizeof(stat));
statFileLoad.close();
} else
{
statFileLoad.close();
stat.numberStudents = 0;
stat.numberMens = 0;
stat.numberWomans = 0;
stat.averageClass = 0.0;
std::ofstream statFileSave("data.bin",std::ios::binary);
statFileSave.write((const char*)&stat,sizeof(stat));
statFileSave.close();
for(int i=0;i<3;i++)
{
std::cout<<"Brak zapisanych uczniow! Start za "<<3-i<<" sekundy..."<<std::endl;
Sleep(1000);
system("cls");
}
}
}
void mainMenu(Statistics stat)
{
std::cout<<"DZIENNIK KLASY"<<std::endl;
std::cout<<"====================="<<std::endl;
std::cout<<"Liczba uczniow: "<<stat.numberStudents<<std::endl;
std::cout<<"Liczba mezczyzn: "<<stat.numberMens<<std::endl;
std::cout<<"Liczba kobiet: "<<stat.numberWomans<<std::endl;
std::cout<<"Srednia klasy: "<<stat.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 ucznia"<<std::endl;
std::cout<<"4.Usun ucznia"<<std::endl;
std::cout<<"5.Czyszczenie ocen"<<std::endl;
std::cout<<"6.WYJSCIE"<<std::endl;
std::cout<<"=====================";
variables::choice = getch();
if(variables::choice=='6')
{
exit(0);
} else std::cout<<"Nieprawidlowy znak!"<<std::endl;
}
int main()
{
//£ADOWANIE DANYCH
Statistics statistics;
//Student students[]; - vector
loadStatistics(statistics);
for(;;)
{
system("cls");
mainMenu(statistics);
}
return 0;
}
Dlaczego tak się dzieje ? Czy w trakcie odczytu danych z pliku program ich nie wprowadza do struktury na stałe tylko na czas otwarcia pliku ?
BTW - czy tworzenie namespace dla zmiennych/stałych jako alternatywa do zmiennych/stałych globalnych to akceptoalna praktyka ?
Tak wiem - powinno się pisać obiektowo,ale na ten moment chcę przerobić inne rzeczy z C++ a obiektówkę zostawić na później.