Witam
Jestem nowy na tym forum. Piszę programik który ma być bazą danych. Od kilku dni męczę się nad zagadnieniem dotyczącym zapisem i odczytem danych (plik binarny)
Oto moja struktura danych:
typedef unsigned int ui;
typedef short unsigned int sui;
struct osoba
{
char nick[30];
ui pkt; //ile pkt
ui wie; //ile wieżowców
ui dom; //ile domków
ui fab; //ile fabryk
ui raf; //ile rafinerii
ui kop; //ile kopalnii
ui amm; //ile fabryk amunicji
sui fsa; //ile fabryk samolotów
sui fcz; //ile fabryk czołgów
sui fst; //ile fabryk statków
sui geo; //jaki poziom geologii
sui scz; //jaki poziom symulatora czołgów
sui sst; //jaki poziom symulatora statkow
sui ssa; //jaki poziom symulatora samolotów
};
Zapis do pliku (jeszcze nie zrobiłem zabezpieczeń poprawnego otwierania itp. bo najpierw chcę by samo w sobie dobrze działało)
ofstream ofs("plik.foo", ios::binary); // otwieramy plik do zapisu binarnego
ofs.write((char*)(os), sizeof(osoba)); // zapisujemy dane do pliku
Oraz odczyt danych:
ifstream ifs("plik.foo", ios::binary); // otwieramy plik do odczytu binarnego
char* temp = new char[sizeof(osoba)]; // tymczasowy bufor na dane
ifs.read(temp, sizeof(osoba)); // wczytujemy dane do bufora
osoba* os = (osoba*)(temp); // rzutujemy zawartość bufora na typ File
sui dl=0;
while(os->nick[dl]!=char(13))
{
cout<<os->nick[dl];
dl++;
}
cout << os->pkt <<endl;
cout << os->wie <<endl;
cout << os->dom <<endl;
cout << os->fab <<endl;
cout << os->raf <<endl;
cout << os->amm <<endl;
cout << os->fsa <<endl;
cout << os->fcz <<endl;
cout << os->fst <<endl;
cout << os->geo <<endl;
cout << os->ssa <<endl;
cout << os->scz <<endl;
cout << os->sst <<endl;
Mój problem:
Gdy wpisuje nick (tablica char 30-elementów) to po odczytaniu wywala mi jakieś krzaczki
np jak wpisałem egregious
to wyświetla mi egregiouss\system32\cmd.exe (piszę z pamięci)
Ogólnie wydaje mi się że problem jest już przy wprowadzaniu danych bo jak kazałem wyświetlić tablicę bez niczego (tzn bez ówczesnego zapisania jej do pliku tzn zaraz po wprowadzeniu danych) to i tak wali krzaki... problem rozwiązałem w taki sposób: gdy user zatwierdzi koniec wprowadzania nicku (enter - char(13) ) to po niku program wstawia enter
np egregious -- egregious[char(13)]
I w czasie odczytu jak widać on wypisuje do chwili napotkania char(13)
I to jest mój problem... walczę z tym już jakiś czas i to jedyne co wymyśliłem.
Natomiast drugi to nie mam pojęcia jak zmienić wczytywanie danych by wczytywał cały plik a nie tylko pierwszy rekord (btw wiem że zapisywany jest tylko jeden ale to nie problem dopiszę tylko ios::app przy otwieraniu pliku do zapisu i po kłopocie, usunąłem to tymczasowo by widzieć jakie zmiany wprowadzam) jedyne co wiem to że użyć trzeba pętli while i zapewne znacznika EOF ale jak zastosować to nie mam pojęcia...
Pozdrawiam Egregious